1. 程式人生 > 實用技巧 >建立執行緒的四種方式

建立執行緒的四種方式

建立執行緒的四種方式

一、繼承Thread類

繼承Thread類建立執行緒的步驟為:

  (1)建立一個類繼承Thread類,重寫run()方法,將所要完成的任務程式碼寫進run()方法中;

(2)建立Thread類的子類的物件;

(3)呼叫該物件的start()方法,該start()方法表示先開啟執行緒,然後呼叫run()方法;

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 publicclassThread1 { publicstaticvoidmain(String[] args) {
Thread.currentThread().setName("主執行緒"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //建立一個新執行緒 ThreadDemo1 thread1 =newThreadDemo1(); //為執行緒設定名稱 thread1.setName("執行緒一"); //開啟執行緒 thread1.start(); } } classThreadDemo1extendsThread{ @Override publicvoidrun() { System.out.println(Thread.currentThread().getName()+
":"+"輸出的結果"); } }

二、實現Runnable介面

實現Runnable介面建立執行緒的步驟為:

(1)建立一個類並實現Runnable介面

(2)重寫run()方法,將所要完成的任務程式碼寫進run()方法中

(3)建立實現Runnable介面的類的物件,將該物件當做Thread類的構造方法中的引數傳進去

(4)使用Thread類的構造方法建立一個物件,並呼叫start()方法即可執行該執行緒

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public
classThread2 { publicstaticvoidmain(String[] args) { Thread.currentThread().setName("主執行緒"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //建立一個新執行緒 Thread thread2 =newThread(newThreadDemo2()); //為執行緒設定名稱 thread2.setName("執行緒二"); //開啟執行緒 thread2.start(); } } classThreadDemo2implementsRunnable { @Override publicvoidrun() { System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } }

三、實現Callable介面

實現Callable介面建立執行緒的步驟為:

(1)建立一個類並實現Callable介面

(2)重寫call()方法,將所要完成的任務的程式碼寫進call()方法中,需要注意的是call()方法有返回值,並且可以丟擲異常

(3)如果想要獲取執行該執行緒後的返回值,需要建立Future介面的實現類的物件,即FutureTask類的物件,呼叫該物件的get()方法可獲取call()方法的返回值

 (4)使用Thread類的有參構造器建立物件,將FutureTask類的物件當做引數傳進去,然後呼叫start()方法開啟並執行該執行緒。

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 publicclassThread3 { publicstaticvoidmain(String[] args)throwsException { Thread.currentThread().setName("主執行緒"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //建立FutureTask的物件 FutureTask<String> task =newFutureTask<String>(newThreadDemo3());         //FutureTask task =newFutureTask(newCallable(){});匿名內部類 //建立Thread類的物件 Thread thread3 =newThread(task); thread3.setName("執行緒三"); //開啟執行緒 thread3.start(); //獲取call()方法的返回值,即執行緒執行結束後的返回值 String result = task.get();//get執行會導致當前執行緒阻塞,效率比較低 System.out.println(result); } } classThreadDemo3implementsCallable<String> { @Override publicString call()throwsException { System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); returnThread.currentThread().getName()+":"+"返回的結果"; } }

四、使用執行緒池建立

使用執行緒池建立執行緒的步驟:

(1)使用Executors類中的newFixedThreadPool(int num)方法建立一個執行緒數量為num的執行緒池

(2)呼叫執行緒池中的execute()方法執行由實現Runnable介面建立的執行緒;呼叫submit()方法執行由實現Callable介面建立的執行緒

(3)呼叫執行緒池中的shutdown()方法關閉執行緒池

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 publicclassThread4 { publicstaticvoidmain(String[] args)throwsException { Thread.currentThread().setName("主執行緒"); System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); //通過執行緒池工廠建立執行緒數量為2的執行緒池 ExecutorService service = Executors.newFixedThreadPool(2); //執行執行緒,execute()適用於實現Runnable介面建立的執行緒 service.execute(newThreadDemo4()); service.execute(newThreadDemo6()); service.execute(newThreadDemo7()); //submit()適用於實現Callable介面建立的執行緒 Future<String> task = service.submit(newThreadDemo5()); //獲取call()方法的返回值 String result = task.get(); System.out.println(result); //關閉執行緒池 service.shutdown(); } } //實現Runnable介面 classThreadDemo4implementsRunnable{ @Override publicvoidrun() { try{ Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } } //實現Callable介面 classThreadDemo5implementsCallable<String>{ @Override publicString call()throwsException { try{ Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); returnThread.currentThread().getName()+":"+"返回的結果"; } } //實現Runnable介面 classThreadDemo6implementsRunnable{ @Override publicvoidrun() { try{ Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } } //實現Runnable介面 classThreadDemo7implementsRunnable{ @Override publicvoidrun() { try{ Thread.sleep(1000); }catch(InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+":"+"輸出的結果"); } }

FutureTask<String> task =newFutureTask<String>(newThreadDemo3());

------------恢復內容結束------------