實現多線程的三種方法


實現多線程的三種方法
Java虛擬機允許應用程序運行多個線程。在Java語言中多線程的實現一般有一下三種方法:
1、實現Runnable接口,並實現該接口的run()方法
以下是主要步驟:
1)、自定義類並實現Runnable接口,實現run()方法;
2)、創建Thread對象,用實現Runnable接口的對象作為參數實例化該Thread對象;
3)、調用Thread的start()方法。
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("Thread start!");
}
}
public class Test {

public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t = new Thread(thread);
t.start();
}
}


2、繼承Thread類,重寫run()方法
Thread本質上也是實現Runnable接口的一個實例,它代表一個線程的實例,並且啟動線程的唯一方法是通過Thread類的start()方法。start()方法是一個native(本地)方法,它將啟動一個新線程,並執行run()方法(Thread方法中提供的run()方法是一個空方法)。這種方式通過自定義類直接extend(繼承)Thread,並重寫run()方法,就可以啟動新線程並執行自己定義的run()方法。需要注意的是,當start()方法調用過后並不是立即執行多線程代碼,而是是的該線程變為可運行狀態(Runnable),什么時候運行多線程代碼是由操作系統決定的。
class MyThread extends Thread{
@Override
public void run() {
System.out.println("Thread start!");
}
}
public class Test {

public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start();
}
}


3、實現Callable接口,重寫call()方法
Callable對象實際是屬於Executor框架中的功能類,Callable接口與Runnable接口類似,但是提供了比Runnable更強大的功能,主要表現為一下三點:
1)、Callable可以在任務結束后提供一個單回執,Runnable無法提供這個功能;
2)、Callable中的call()方法可以拋出異常,但是Runnable中的run()方法不能拋出異常;
3)、運行Callable可以拿到一個Future對象,Future對象表示異步計算的結果。它提供了檢查計算是否完成的方法。由於線程屬於異步計算模型,所以無法從其他相稱中得到方法的返回值,在這種情況下,就可以使用Future來監視目標線程調用call()方法的情況,當調用Future的get()方法以獲取結果時,當前線程就會阻塞,知道call()方法結束返回結果。
import java.util.concurrent.*;

/**
* Created by 胡柏青 on 2017/5/19.
*/
public class CallableAndFuture {
//創建線程類
public static class CallableTest implements Callable<String>{
@Override
public String call() throws Exception {
return "Hello Word!";
}
}

public static void main(String[] args){
ExecutorService threadPool = Executors.newSingleThreadExecutor();
//啟動線程
Future<String> future = threadPool.submit(new CallableTest());
try {
System.out.println("waiting thread to finish!");
System.out.println(future.get());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
}

在以上三種方式中,前兩種方式線程執行完后沒有返回值,只有最后一種是帶有返回值的。
當需要實現多線程時一般推薦實現Runnable接口的方式,原因:首先,Thread類中定義了多種方法可以被派生類使用或重寫,但是只有run方法是必須被重寫的,在run方法中實現這個線程的只要功能。這也是實現Runnable接口所需的同樣的方法。因此,如果沒有必要重寫Thread類中的其他方法,那么通過繼承Thread的實現方法與實現Runnable接口的效果相同,這種情況下最好通過實現Runnable接口的方式創建線程。

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com