通過建立一個實現了Runnable介面的對象,並以它作為線程的目標對象來建立一個線程。 Runnable介面:定義了一個抽象方法run()。定義如下: public interface java.lang.Runnable{ public abstract void run(); } 建立的總體架構如下: class MyRunner implements Runnable { public void run() { … } } MyRunner r = new MyRunner(); Thread t = new Thread( ThreadGroup group, Runnable target, String name); 見例題: ThreadTesterer.java ThreadTest.java 例如: public class Clock extends java.applet.Applet implements Runnable { Thread clockThread; public void start() { if (clockThread == null) { clockThread = new Thread(this, "Clock"); clockThread.start(); } } public void run() { while (clockThread != null) { repaint(); try { clockThread.sleep(1000); } catch (InterruptedException e){ } } } public void paint(Graphics g) { Date now = new Date(); g.drawString(now.getHours() + ":" + now.getMinutes() + ":" + now.getSeconds(), 5, 10); } public void stop() { clockThread.stop(); clockThread = null; } } 這是一個時鐘Applet,它顯示目前時間並逐秒進行更新。該Applet利用Runnable介面為其線程提供run()方法。類Clock由類Applet擴充而得,但同時它需要一個線程來實現時間的更新顯示。由於Java中不支援多重繼承,所以它不能再繼承類Thread,而是利用了Runnable介面。 首先,在start()方法中構造了一個名為clockThread的線程 並調用Thread.start()方法來啟動這一線程,即在Java運行時建立系統的線程關係。下面這句建立了一個新的線程: clockThread = new Thread(this, "Clock"); 其中this是Thread 構造方法中的第一個自變數,作為該線程的目標對象,它必須實現Runnable介面。在這種構造方法下,線程clockThread就以它的可啟動並執行目標對象中的run()方法為其run()方法,在本例中,這個目標對象就是Clock Applet。構造方法中的第二個變數為線程名。 線程被啟動以後,調用目標對象的run()方法,除非線程被停止。在run()方法的迴圈中,Applet重繪本身,然後睡眠1秒,同時要捕獲例外事件並進行處理。 如果你離開顯示時鐘的這一頁,應用程式將調用stop()方法,將線程置空。當你返回時,又會建立一個新的線程。 在具體應用中,採用哪種方法來構造線程體要視情況而定。通常,當一個線程已繼承了另一個類時,就應該用第二種方法來構造,即實現Runnable介面。 |