建立執行緒的四種方式
一、繼承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 |
public class Thread1 {
public static void main(String[] args) {
Thread.currentThread().setName( "主執行緒" );
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
//建立一個新執行緒
ThreadDemo1 thread1 = new ThreadDemo1();
//為執行緒設定名稱
thread1.setName( "執行緒一" );
//開啟執行緒
thread1.start();
}
}
class ThreadDemo1 extends Thread{
@Override
public void run() {
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 class Thread2 {
public static void main(String[] args) {
Thread.currentThread().setName( "主執行緒" );
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
//建立一個新執行緒
Thread thread2 = new Thread( new ThreadDemo2());
//為執行緒設定名稱
thread2.setName( "執行緒二" );
//開啟執行緒
thread2.start();
}
}
class ThreadDemo2 implements Runnable {
@Override
public void run() {
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 |
public class Thread3 {
public static void main(String[] args) throws Exception {
Thread.currentThread().setName( "主執行緒" );
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
//建立FutureTask的物件
FutureTask<String> task = new FutureTask<String>( new ThreadDemo3());
//FutureTask task = new FutureTask( new Callable(){});匿名內部類
//建立Thread類的物件
Thread thread3 = new Thread(task);
thread3.setName( "執行緒三" );
//開啟執行緒
thread3.start();
//獲取call()方法的返回值,即執行緒執行結束後的返回值
String result = task.get();//get執行會導致當前執行緒阻塞,效率比較低
System.out.println(result);
}
}
class ThreadDemo3 implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
return Thread.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 |
public class Thread4 {
public static void main(String[] args) throws Exception {
Thread.currentThread().setName( "主執行緒" );
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
//通過執行緒池工廠建立執行緒數量為2的執行緒池
ExecutorService service = Executors.newFixedThreadPool( 2 );
//執行執行緒,execute()適用於實現Runnable介面建立的執行緒
service.execute( new ThreadDemo4());
service.execute( new ThreadDemo6());
service.execute( new ThreadDemo7());
//submit()適用於實現Callable介面建立的執行緒
Future<String> task = service.submit( new ThreadDemo5());
//獲取call()方法的返回值
String result = task.get();
System.out.println(result);
//關閉執行緒池
service.shutdown();
}
}
//實現Runnable介面
class ThreadDemo4 implements Runnable{
@Override
public void run() {
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
}
}
//實現Callable介面
class ThreadDemo5 implements Callable<String>{
@Override
public String call() throws Exception {
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
return Thread.currentThread().getName()+ ":" + "返回的結果" ;
}
}
//實現Runnable介面
class ThreadDemo6 implements Runnable{
@Override
public void run() {
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
}
}
//實現Runnable介面
class ThreadDemo7 implements Runnable{
@Override
public void run() {
try {
Thread.sleep( 1000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+ ":" + "輸出的結果" );
}
}
|
FutureTask<String> task =
new
FutureTask<String>(
new
ThreadDemo3());
------------恢復內容結束------------