Callable實現帶有返回值的執行緒
阿新 • • 發佈:2019-01-30
我們都知道執行緒是沒有返回值的,在Runnable介面中,只有一個抽象的Run方法,使用Callable我們能夠實現帶有返回值得的執行緒,下面是一個demo
/**
*
*/
package com.mingrisoft.threadone;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
public class Test {
int value=100;//賬戶錢
public static void main(String[] args) {
// TODO Auto-generated method stub
new Test();
}
public Test() {
Thread thread=new Thread(new FutureTask<>(new run()));
Thread thread2=new Thread(new FutureTask<>(new run1()));
thread.start();
thread2.start();
}
class run implements Callable<Integer>{
@Override
public Integer call() throws Exception {
//在這裡實現計算
for(int i=0;i<10;i++){
value+=10;
System.out.println("run一的計算結果為:"+value);
}
return value;
}
}
class run1 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
for(int i=0;i<10;i++){
value+=10;
System.out.println("run2一的計算結果為:"+value);
}
return value;
}
}
}
具體就不講解嘍,大家可以檢視官方文件,現在我們來看看列印結果
我們發現同時執行,執行緒2居然被阻塞了,通過著我們發現可以通過這實現非同步計算,
上面我們建立了FutureTask物件,FutureTask實現了Runnable介面
官方給出這樣的說明
可取消的非同步計算。利用開始和取消計算的方法、查詢計算是否完成的方法和獲取計算結果的方法,此類提供了對 Future 的基本實現。僅在計算完成時才能獲取結果;如果計算尚未完成,則阻塞 get 方法。一旦計算完成,就不能再重新開始或取消計算。可使用 FutureTask 包裝 Callable 或 Runnable 物件。因為 FutureTask 實現了 Runnable,所以可將 FutureTask 提交給 Executor 執行。
那麼說了,如果計算沒有完成,就會阻塞get方法,先我們來測試一下
修改程式的程式碼:
/**
*
*/
package com.mingrisoft.threadone;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Test {
int value=100;//賬戶錢
public static void main(String[] args) {
// TODO Auto-generated method stub
new Test();
}
public Test() {
FutureTask<Integer> future=new FutureTask<>(new run());
FutureTask<Integer> future1=new FutureTask<>(new run1());
Thread thread=new Thread(future);
Thread thread2=new Thread(future1);
thread.start();
thread2.start();
try {
int i=future.get();
int j=future1.get();
System.out.println("i的計算結果為:"+i);
System.out.println("j的計算的結果為:"+j);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class run implements Callable<Integer>{
@Override
public Integer call() throws Exception {
//在這裡實現計算
for(int i=0;i<10;i++){
value+=10;
// System.out.println("run一的計算結果為:"+value);
}
return value;
}
}
class run1 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
for(int i=0;i<10;i++){
value+=10;
// System.out.println("run2一的計算結果為:"+value);
}
return value;
}
}
}