Callable接口(类似于Runnable)
文章目录
- Callable接口(类似于Runnable)
- 一、概念
- 1、简介
- 2、API文档
- 3、源码
- 二、代码案例
- 1、案例1(1个线程)
- 2、案例2(2个线程)
Callable接口(类似于Runnable)
一、概念
1、简介
- Callable接口类似于Runnable
- new Thread(new FutureTask(Callable)).start(); 开启线程
- new Thread().start(); 启动线程
2、API文档
3、源码
- 可以有返回值
- 可以抛出异常
- 方法不同 call()
二、代码案例
1、案例1(1个线程)
package com.sgz.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 日期:2022/8/29 - 11:30
* 需求:
*/
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// new Thread(new Runnable()).start();
// new Thread(new FutureTask<V>()).start();
// new Thread(new FutureTask<V>(Callable)).start();
// new Thread().start(); // 怎么启动 Callable
MyThread thread = new MyThread();
FutureTask futureTask = new FutureTask(thread); // 适配类
new Thread(futureTask,"A").start();
Integer o = (Integer) futureTask.get(); // 获取 Callable 的返回结果
System.out.println(o);
}
}
// 泛型的参数等于方法的返回值
class MyThread implements Callable<Integer> {
@Override
public Integer call() {
System.out.println("call()");
return 1024;
}
}
细节:
- 有缓存
- 结果可能需要等待,会阻塞
2、案例2(2个线程)
package com.sgz.callable;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
/**
* 日期:2022/8/29 - 11:30
* 需求:
*/
public class CallableTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
// new Thread(new Runnable()).start();
// new Thread(new FutureTask<V>()).start();
// new Thread(new FutureTask<V>(Callable)).start();
// new Thread().start(); // 怎么启动 Callable
MyThread thread = new MyThread();
FutureTask futureTask = new FutureTask(thread); // 适配类
new Thread(futureTask,"A").start();
new Thread(futureTask,"B").start(); // 结果会被缓存,效率高
Integer o = (Integer) futureTask.get(); // 获取 Callable 的返回结果,get方法可能会产生阻塞,一般把它放到最好或者使用异步通信来处理
System.out.println(o);
}
}
// 泛型的参数等于方法的返回值
class MyThread implements Callable<Integer> {
@Override
public Integer call() {
System.out.println("call()");
// 耗时操作
return 1024;
}
}