茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671863 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
IMG_216224.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

爪哇咖啡屋 : [轉貼]實作 Runnable 介面

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]實作 Runnable 介面

Java Gossip: 實作 Runnable 介面

一個進程(Process)是一個包括有自身執行位址的程式,在一個多工的作業系統中,可以分配CPU時間給每一個進程,CPU在片段時間中執行某個進程,然後下一個時間片段跳至另一個進程去執行,由於轉換速度很快,這使得每個程式像是在同時進行處理一般。

一個執行緒是進程中的一個執行流程,一個進程中可以同時包括多個執行緒,也就是說一個程式中同時可能進行多個不同的子流程,這使得一個程式可以像是同時間 處理多個事務,例如一方面接受網路上的資料,另一方面同時計算資料並顯示結果,一個多執行緒程式可以同時間處理多個子流程。

在Java中要實現執行緒功能,可以 實作Runnable介面,Runnable介面中只定義一個 run()方法,然後 實例化一個 Thread物件時,傳入一個實作Runnable介面的物件作為引數,Thread物件會調用Runnable物件的run()方法,進而執行當中所定義的流程。

下面這個程式是個簡單的Swing程式,您可以看到如何實作Runnable介面及如何啟動執行緒:

  • ThreadDemo.java

package onlyfun.caterpillar;

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.*;

public class ThreadDemo extends JFrame {
public ThreadDemo() {
// 配置按鈕
JButton btn = new JButton("Click me");

// 按下按鈕後繪製圓圈
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Thread thread1 = new Thread(new Runnable() {
public void run() {
Graphics g = getGraphics();

for(int i = 10; i < 300; i+=10) {
try {
Thread.sleep(500);
g.drawOval(i, 100, 10, 10);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
});

Thread thread2 = new Thread(new Runnable() {
public void run() {
Graphics g = getGraphics();

for(int i = 10; i < 300; i+=10) {
try {
Thread.sleep(500);
g.drawOval(i, 150, 15, 15);
}
catch(InterruptedException e) {
e.printStackTrace();
}
}
}
});

thread1.start();
thread2.start();
}
});

getContentPane().add(btn, BorderLayout.NORTH);

// 取消按下視窗關閉鈕預設動作
setDefaultCloseOperation(
WindowConstants.EXIT_ON_CLOSE);
setSize(320, 200);

setVisible(true);
}

public static void main(String[] args) {
new ThreadDemo();
}
}


將程式編譯並執行時,您可以看到一個視窗,按下上面的按鈕,您會看到兩個圓在「同時」繪製,雖說是同時,其實也只是錯覺而已,其實是CPU往來兩個流程之間不斷的進行繪製圓的動作而已。

Thread類別也實作了Runnable介面,您也可以繼承Thread類別並重新定義它的run()方法,好處是可以使用Thread上的一些繼承下來的方法,例如yield(),然而繼承了Thread就表示您不能讓您的類別再繼承其它的類別。

原文出處: 實作 Runnable 介面
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]實作 Runnable 介面

D25:[Java]實作 Runnable 介面

若本身類別已經繼承了其他父類別,但又想繼承 Thread 類別,這時就會遇到 Java 無法多重繼承。
想到多重繼承就會想到 介面,在[JAVA]多重繼承中提到:透過 介面 就能達到多重繼承。

Java 提供了 Runnable 介面,有抽象函數 run() ;因此我們只需要定義 run() 即可。

改寫[Java]啟動執行緒 中的範例:

讓我們先實作介面


class multi_Test implements Runnable
{
private String name;
public multi_Test(String str)
{
name=str;
}
public void run()
{
}
}

且詳細定義 run函數


public void run()
{
for(int i=0;i<4;i++)
{
for(int j=0;j<100000000;j++);
System.out.println(id+" is running..");
}
}

而在main() 中:我們建立物件後,再分別產生 Thread 類別的物件 來呼叫 start() 啟動執行緒


multi_Test apple=new multi_Test("apple");
multi_Test pen=new multi_Test("pen");
Thread m1=new Thread(apple);
Thread m2=new Thread(pen);
m1.start();
m2.start();

以下完整程式碼參考:


class multi_Test implements Runnable
{
private String name;
public multi_Test(String str)
{
name=str;
}
public void run()
{
for(int i=0;i<3;i++)
{
for(int j=0;j<100000000;j++);
System.out.println(id+" is running..");
}
}
}
public class multi_thread_3
{
public static void main(String args[])
{
multi_Test apple=new multi_Test("apple");
multi_Test pen=new multi_Test("pen");
Thread m1=new Thread(apple);
Thread m2=new Thread(pen);
m1.start();
m2.start();
}
}



Q:那麼該使用 Thread類別 還是 Runnable介面呢?
A:其實都可以,了解該類別是否有繼承其他類別。因為類別只能繼承一個類別。

那如果使用多執行緒的類別已經繼承其他類別,就必須實作。
我們可以這麼寫:


class multi_Test extends m_test implements Runnable
{
...
}

以上意思:multi_Test 類別繼承 m_test 類別 並實作 Runnable 介面
這麼一來multi_Test 可以使用多執行緒,又能繼承 m_test 類別。


如果您喜歡我的文章,可以至 4xDevJava 學習系列閱讀更多 Java 文章。



原文出處: D25:[Java]實作 Runnable 介面 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|