Callable创建线程
与Runnable相比: 两者都是为了执行另一个线程 但是 Callable
创建线程方式一
实现 Runnable
public class TestCallable {
public static void main(String[] args) {
new Thread(new MyThread()).start();
}
}
/**
* 另一条线程
*/
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("另一条线程执行了");
}
}
另一条线程执行了
创建线程方式二
实现 Callable
public class TestCallable { //抛出了异常
public static void main(String[] args) throws ExecutionException, InterruptedException {
//若想执行Callable线程 需使用 Runnable的一个实现类
MyThread myThread = new MyThread();
FutureTask<String> futureTask = new FutureTask<String>(myThread);
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start(); //使用了缓存 所以仅打印一次"另一条线程执行了"
//获取线程返回值
String s = futureTask.get();//get()等待结果返回 可能产生阻塞 最后再执行 或异步
System.out.println("s = " + s);
}
}
/**
* 另一条线程
*/
class MyThread implements Callable<String>{//返回值类型
@Override
public String call() throws Exception {
System.out.println("另一条线程执行了");
//耗费时间
return "返回值";
}
}
另一条线程执行了
s = 返回值
有缓存 会阻塞