Callable和Runable相比
//Runnable和Callable區別
//1.Callable帶返回值
//2.run()不會拋異常,call()會拋異常
//3.實現的接口不同
package JUC;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
/**
* 多線程中第三種活動線程的方法
*/
//Runnable和Callable區別
//1.Callable帶返回值
//2.run()不會拋異常,call()會拋異常
//3.接口實現的接口不同
//class MyThread implements Runnable{
// @Override
// public void run() {
//
// }
//}
class MyThread2 implements Callable{
@Override
public Integer call() throws Exception {
System.out.println(Thread.currentThread().getName()+"\t come in callable");
TimeUnit.SECONDS.sleep(3);
return 1024;
}
}
//適配器模式
//併發異步導致callable出現,
public class CallableDemo {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask = new FutureTask<>(new MyThread2());
FutureTask<Integer> futureTask1 = new FutureTask<>(new MyThread2());
new Thread(futureTask,"AA").start();
//new Thread(futureTask,"BB").start();//不會再進入callable,因爲可以複用,所以沒必要在進入一次,想多算就需要多啓動futureTask
new Thread(futureTask1,"BB").start();
int result1 = 100;
//int result = futureTask.get();//獲得callable線程的結算結果,如果沒有計算完成就要去強求,會導致堵塞,直到計算完成,
// 如果現在去取futureTask.get()結果那麼main線程就會堵塞,因爲沒計算完,所以放到最後會先讓main線程執行,最後再去取callable線程結果
int result = futureTask.get();
System.out.println("*******result:"+(result+result1));
}
}