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

    }
}

发布了83 篇原创文章 · 获赞 61 · 访问量 9170

猜你喜欢

转载自blog.csdn.net/weixin_43736084/article/details/103924839
今日推荐