91名师指路-头部
91名师指路

Callable的使用

由于某些原因,现在不支持支付宝支付,如需要购买源码请加博主微信进行购买,微信号:13248254750

概述:在创建线程时,Thread t=new Thread(); 里面穿的是Runnable,但是juc包下面并没有直接的接口,那么又一个类同时实现了Callable和Runnable,那就是FutureTask


代码如下:

package com.mszl.thread;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
* 功能:Callable演示
* 备注:更多资料请访问 http://www.91mszl.com
* @author bobo teacher
*/
class callFace implements Callable<Integer>{

@Override
public Integer call() throws Exception {
System.out.println("come in");
return 8888;
}

}

public class CallableDemo{

public static void main(String[] args) throws InterruptedException, ExecutionException {
callFace cf=new callFace();
FutureTask<Integer> ft=new FutureTask<>(cf); // FutureTask 同时实现了Callable和Runnable

Thread t=new Thread(ft, "A");
t.start();

Thread t1=new Thread(ft, "B");
t1.start();

int result0=12;
int result1=ft.get();
int result2=result0+result1;
System.out.println(ft.get()); // 获取到返回值:ft.get()建议放到最后,如果放到前面可能导致线程阻塞
System.out.println(result2);
}

}


执行结果:

come in
8888
8900


总结:

(1)如无特殊要求,建议将ft.get(),即FutureTask的返回值这行代码放到程序的最后,因为如果放到前面可能导致线程阻塞。

(2)多个线程同时调用FutureTask的call方法时,只会调用一次。如上面的例子,A,B两个线程都启动了,但call方法里面的come in 只打印了一次。


2019-12-03 11:09:05     阅读(1057)

名师出品,必属精品    https://www.91mszl.com

联系博主    
用户登录遮罩层
x

账号登录

91名师指路-底部