Java建立執行緒的方法和區別
阿新 • • 發佈:2021-01-20
文章目錄
建立執行緒的四種方式
-
1:繼承Thread類建立執行緒
-
2:實現Runnable介面建立執行緒
-
3:使用Callable和FutureTask建立執行緒
-
4:使用執行緒池,例如用Executor框架建立執行緒
區別
1、使用繼承Thread類的方式建立多執行緒
-
因為java單繼承的機制無法再繼承其他的類
-
直接使用this即可獲得當前執行緒
2、實現Callable和Runnable建立多執行緒
-
執行緒類只是實現了Runnable介面或Callable介面,還可以繼承其他類。
-
在這種方式下,多個執行緒可以共享同一個target物件,所以非常適合多個相同執行緒來處理同一份資源的情況,從而可以將CPU、程式碼和資料分開,形成清晰的模型,較好地體現了面向物件的思想。
3、Callable和Runnable的區別
相同點:
-
兩者都是介面
-
兩者都需要呼叫Thread.start啟動執行緒
不同點:
-
callable的核心是call方法,允許返回值,runnable的核心是run方法,沒有返回值
-
call方法可以丟擲異常,但是run方法不行
-
因為runnable是java1.1就有了,所以他不存在返回值,後期在java1.5進行了優化,就出現了callable,就有了返回值和拋異常
-
callable和runnable都可以應用於executors。而thread類只支援runnable
示例
/**
* CreateThreadTest
*
* @author xgSama
* @date 2021/1/19 11:46
*/
public class CreateThreadTest {
public static void main(String[] args) throws Exception {
// 方式一:繼承Thread
MyThread thread1 = new MyThread();
thread1. start();
// 方式二:實現Runable
Thread thread2 = new Thread(new MyRunnable());
thread2.start();
// 方式三:實現Callable
Callable<Integer> callable = new MyCallable();
FutureTask<Integer> futureTask = new FutureTask<>(callable);
Thread thread3 = new Thread(futureTask);
thread3.start();
Integer integer = futureTask.get();
System.out.println(integer);
// 方式四:執行緒池
ExecutorService es = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
es.execute(() ->
System.out.println(Thread.currentThread() + "created by Executors"));
}
es.shutdown();
}
}
// 方式一、繼承Thread類,重寫run方法
class MyThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread() + "created by Thread");
}
}
// 方二、實現Runnable介面,重寫run方法,將實現類的例項物件作為Thread建構函式的target建立並啟動執行緒
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread() + "created by Runnable");
}
}
// 方式三、實現Callable介面,使用FutureTask類包裝Callable物件,使用FutureTask物件作為Thread物件的target建立並啟動執行緒
class MyCallable implements Callable<Integer> {
@Override
public Integer call() {
System.out.println(Thread.currentThread() + "created by Callable ");
return 666;
}
}