Callable带返回值接口使用

获取多线程的方式 
1. 继承Thread 
2. 实现Runnable接口 
3. 实现Callable接口 带范型有返回值 FutureTask(Callable<V>) 
4. 线程池

Callable返回值获取放在最后(futureTask.get()) 
调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask

/**
 * Callable创建线程的方式(Callable带返回值)
 */
class MyThreadByCallable implements Callable<Integer>{

    @Override
    public Integer call() throws Exception {
        System.out.println(Thread.currentThread().getName() + "\t 来模拟计算");

        // 模拟计算业务
        TimeUnit.SECONDS.sleep(3);

        return 1024;
    }
}
/***
 * 三种创建线程方式
 * 1、继承Thread类
 * 2、实现Runnable接口
 * 3、使用Callable<String>接口,结合FutureTask
 * 今天就来演示Callable创建线程的方式(Callable带返回值)
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask<Integer> futureTask = new FutureTask<>(new MyThreadByCallable());
        // FutureTask<Integer> futureTask2 = new FutureTask<>(new MyThreadByCallable());

        Thread thread = new Thread(futureTask, "t1");
        thread.start();
        // 调用多次FutureTask仍然只执行一次,执行多次则需要创建多个FutureTask
        // Thread thread2 = new Thread(futureTask2, "t2");
        // thread2.start();

        // Callable返回值获取如果放在这里,它会阻塞main线程计算,会影响并发效率
        // Integer t1Result = futureTask.get();

        // main线程模拟计算
        Integer mainResult = 1000;
        System.out.println("main线程计算完毕,mainResult=" + mainResult);

        /*while(!futureTask.isDone()){

        }*/

        // Callable返回值获取最好放在最后,否则如果t1计算时间过长,它会阻塞main线程计算
        Integer t1Result = futureTask.get();

        System.out.println("t1线程计算完毕,t1Result=" + t1Result);
        System.out.println("两个线程计算总和为:" + (mainResult + t1Result));


        System.out.println(Runtime.getRuntime().availableProcessors());

    }
}

 

posted @ 2019-09-16 19:21  要好好吃饭  阅读(1081)  评论(0编辑  收藏  举报