舉例講授Java中的多線程編程。本站提示廣大學習愛好者:(舉例講授Java中的多線程編程)文章只能為提供參考,不一定能成為您想要的結果。以下是舉例講授Java中的多線程編程正文
Java創立線程(Runnable接口和Thread類)
年夜多半情形,經由過程實例化一個Thread對象來創立一個線程。Java界說了兩種方法:
上面的順次引見了每種方法。
完成Runnable接口
創立線程的最簡略的辦法就是創立一個完成Runnable 接口的類。Runnable籠統了一個履行代碼單位。你可以經由過程完成Runnable接口的辦法創立每個對象的線程。為完成Runnable 接口,一個類僅需完成一個run()的簡略辦法,該辦法聲明以下:
public void run( )
在run()中可以界說代碼來構建新的線程。懂得上面內容是相當主要的:run()辦法可以或許像主線程那樣挪用其他辦法,援用其他類,聲明變量。唯一的分歧是run()在法式中確立另外一個並發的線程履行進口。當run()前往時,該線程停止。
在你曾經創立了完成Runnable接口的類今後,你要在類外部實例化一個Thread類的對象。Thread 類界說了好幾種結構函數。我們會用到的以下:
Thread(Runnable threadOb, String threadName)
該結構函數中,threadOb是一個完成Runnable接口類的實例。這界說了線程履行的終點。新線程的稱號由threadName界說。
樹立新的線程後,它其實不運轉直到挪用了它的start()辦法,該辦法在Thread 類中界說。實質上,start() 履行的是一個對run()的挪用。 Start()辦法聲明以下:
void start( )
上面的例子是創立一個新的線程並啟動它運轉:
// Create a second thread. class NewThread implements Runnable { Thread t; NewThread() { // Create a new, second thread t = new Thread(this, "Demo Thread"); System.out.println("Child thread: " + t); t.start(); // Start the thread } // This is the entry point for the second thread. public void run() { try { for(int i = 5; i > 0; i--) { System.out.println("Child Thread: " + i); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println("Child interrupted."); } System.out.println("Exiting child thread."); } } class ThreadDemo { public static void main(String args[]) { new NewThread(); // create a new thread try { for(int i = 5; i > 0; i--) { System.out.println("Main Thread: " + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } System.out.println("Main thread exiting."); } }
在NewThread 結構函數中,新的Thread對象由上面的語句創立::
t = new Thread(this, "Demo Thread");
經由過程後面的語句this 注解在this對象中你想要新的線程挪用run()辦法。然後,start() 被挪用,以run()辦法為開端啟動了線程的履行。這使子線程for 輪回開端履行。挪用start()以後,NewThread 的結構函數前往到main()。當主線程被恢復,它達到for 輪回。兩個線程持續運轉,同享CPU,直到它們的輪回停止。該法式的輸入以下:
Child thread: Thread[Demo Thread,5,main] Main Thread: 5 Child Thread: 5 Child Thread: 4 Main Thread: 4 Child Thread: 3 Child Thread: 2 Main Thread: 3 Child Thread: 1 Exiting child thread. Main Thread: 2 Main Thread: 1 Main thread exiting.
如後面提到的,在多線程法式中,平日主線程必需是停止運轉的最初一個線程。現實上,一些老的JVM,假如主線程先於子線程停止,Java的運轉時光體系便可能“掛起”。前述法式包管了主線程最初停止,由於主線程覺醒周期1000毫秒,而子線程僅為500毫秒。這就使子線程在主線程停止之前先停止。簡而言之,你將看到期待線程停止的更好門路。
擴大Thread
創立線程的另外一個門路是創立一個新類來擴大Thread類,然後創立該類的實例。當一個類繼續Thread時,它必需重載run()辦法,這個run()辦法是新線程的進口。它也必需挪用start()辦法去啟動新線程履行。上面用擴大thread類重寫後面的法式:
// Create a second thread by extending Thread class NewThread extends Thread { NewThread() { // Create a new, second thread super("Demo Thread"); System.out.println("Child thread: " + this); start(); // Start the thread } // This is the entry point for the second thread. public void run() { try { for(int i = 5; i > 0; i--) { System.out.println("Child Thread: " + i); Thread.sleep(500); } } catch (InterruptedException e) { System.out.println("Child interrupted."); } System.out.println("Exiting child thread."); } } class ExtendThread { public static void main(String args[]) { new NewThread(); // create a new thread try { for(int i = 5; i > 0; i--) { System.out.println("Main Thread: " + i); Thread.sleep(1000); } } catch (InterruptedException e) { System.out.println("Main thread interrupted."); } System.out.println("Main thread exiting."); } }
該法式生成和前述版原形同的輸入。子線程是由實例化NewThread對象生成的,該對象從Thread類派生。留意NewThread 中super()的挪用。該辦法挪用了以下情勢的Thread結構函數:
public Thread(String threadName)
這裡,threadName指定線程稱號。
選擇適合辦法
到這裡,你必定會奇異為何Java有兩種創立子線程的辦法,哪種更好呢。一切的成績都歸於一點。Thread類界說了多種辦法可以被派生類重載。關於一切的辦法,唯一的必需被重載的是run()辦法。這固然是完成Runnable接口所需的異樣的辦法。許多Java法式員以為類僅在它們被增強或修正時應當被擴大。是以,假如你不重載Thread的其他辦法時,最好只完成Runnable 接口。這固然由你決議。但是,在本章的其他部門,我們運用完成runnable接口的類來創立線程。