Callable接口-創建線程的第三種方法

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));

    }
}

發佈了113 篇原創文章 · 獲贊 73 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章