1. 程式人生 > 實用技巧 >有返回的多執行緒Callable

有返回的多執行緒Callable

Java從【JDK1.5】開始,
提供了 Callable 和 Future,
通過他們可以在任務執行完畢後
得到任務的結果,新的執行緒建立方式:
Callable
Future

他們裡面有特定方法,允許執行緒執行完畢,返回結果:寫return的。

例項:

package com.xzm.有返回多執行緒;

//匯入需要的包
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class _01_實現有返回的多執行緒 {

    
public static void main(String[] args) { System.out.println("主執行緒啟動......"); //例項化建立 Callable的實現類物件 MyCallable my = new MyCallable(); //【Future】: //建立FutureTask操作物件,代入實現類 //把自定義的Callable實現類,轉換成可操作的執行緒類 FutureTask<Integer> ft = new
FutureTask<Integer>(my); //建立子執行緒 Thread t = new Thread(ft); //啟動 t.start(); //提供的方法 //執行緒是否結束 System.out.println("執行緒結束了嗎?" + ft.isDone()); int value = 0; try { //得到返回結果,會強制異常處理
value = ft.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("主執行緒得到結果了=" + value); System.out.println("執行緒結束了嗎?" + ft.isDone()); } } //===================================================== //【Callable介面的實現類】 //第一步:自定義一個類,繼承Callable介面, // 它是泛型的, // 指定操作及返回的資料型別 class MyCallable implements Callable<Integer>{ private String name; public MyCallable(String name){ this.name = name; } @Override public Integer call() throws Exception { return null; } }

小結:

CallableRunnable

java.lang.Runnable;它是一個介面,裡面聲明瞭一個run()方法,
方法返回的是void.
public interface Runnable{
public abstract void run();
}
因此,方法執行完畢後,沒有返回結果的。
-執行操作,針對共有的資料物件,程式碼中操作。

java.util.Concurrent;它也是一個介面,在它裡面也聲明瞭一個call()方法,
這個方法返回一個泛型物件。
public interface Callable<T>{
public abstract T call();
}
因此,方法執行完畢,才會得到一個return的結果。
-執行操作,玩去可以替代Runnable,同時還可以得到return的結果。


什麼使用Callable物件呢?
Java提供了Future來使用它。
<T> Future submit(Callable<T> task);


=============================================================

Runnable介面,實現類繼承Runnable,實現方法run,建立Thread物件使用。
多執行緒,【無法返】回操作。

Callable介面,實現類繼承Callable,實現方法call,建立Future物件使用。
多執行緒,【有返回】的操作。
有三個大功能:
1、判斷任務是否完成
2、能中斷任務
3、可以獲取任務執行結果


所有的操作,最終都是建立Thread,代入指定物件,呼叫start方法


=============================================================

Runnable介面
|------Thread實現類


//自定義的類:第三代,
public class my extends Thread{}

//自定義實現類:第二代,【推薦】
public class my implements Runnable{}


=================================================================
在java中,每一個執行緒都有一個自己的優先順序。

預設情況下,一個想衝,繼承它的父類執行緒的優先順序。

我們可以使用方法 setPrioerity() 提高或降低一個指定執行緒的優先順序

當系統排程的時候,它首先選擇高優先順序的執行緒。

但是優先順序是高度依賴於作業系統的。

Windows預設有7個執行緒的優先順序 1-7

Linux上的java虛擬機器忽略了執行緒的優先順序

==================================================================

不管是 Runnable還是Callable,他們最終都是建立成執行緒物件Thread,
thread提供了多個方法,可以控制執行緒。


sleep()
休眠,
讓執行緒在指定時間內不再執行。
進入CPU,暫時不執行,等一會再執行,
可以保證當前就是我這個執行緒佔據cpu,其他執行緒都在後面排隊。


yield()
讓步,
執行緒暫停,進入就緒狀態,重寫等待系統排程。
後邊獲取到排程的執行緒,可能是其他執行緒,也可能是當前執行緒。


interrupt()
中斷,
中斷當前執行緒,另外一個程式去執行


join()
加入,
阻塞當前呼叫的執行緒,強制執行join方法加入的執行緒