JUC(一)——Locks
JUC(二)——深入理解锁机制
JUC(三)——线程安全类
JUC(四)——强大的辅助类讲解
JUC(五)——Callable
JUC(六)——阻塞队列
JUC(七)——线程池简单使用
JUC(八)——线程池深入讲解
创建线程的方式一共有四种
-
1、继承Thread类创建线程
-
2、实现Runnable接口创建线程
-
3、使用Callable和Future创建线程
-
4、使用线程池例如用Executor框架
前面两种大家肯定都了解,这里我们讲解第三种使用Callable和Future创建线程
Runnable接口和Callable接口的区别
//创建新类MyThread实现runnable接口
class MyThread implements Runnable{
@Override
public void run() {
}
}
//新类MyThread2实现callable接口
class MyThread2 implements Callable<Integer>{
@Override
public Integer call() throws Exception {
return 200;
}
}
- 1、是否有返回值
- Callable有返回值,返回值类型就是泛型类型
- Runnable没有返回值
- 2、是否抛异常
- Callable抛异常
- Runnable不抛异常
- 3、落地方法不一样,一个是run,一个是call
- Callable的方法是call
- Runnable的方法是run
使用Callable接口来创建线程
- Java5提供了Future接口实现了Runnable接口,Future接口的实现类FutureTask既实现了Future接口,还实现了Runnable接口,因此可以作为Thread类的target,并且FutureTask的构造方法的形参可以是Callable ,public FutureTask(Callable<V> callable)。在Future接口里定义了几个公共方法来控制它关联的Callable任务,。
boolean cancel(boolean mayInterruptIfRunning):视图取消该Future里面关联的Callable任务
V get():返回Callable里call()方法的返回值,调用这个方法会导致程序阻塞,必须等到子线程结束后才会得到返回值
V get(long timeout,TimeUnit unit):返回Callable里call()方法的返回值,最多阻塞timeout时间,经过指定时间没有返回抛出TimeoutException
boolean isDone():若Callable任务完成,返回True
boolean isCancelled():如果在Callable任务正常完成前被取消,返回True
class MyThread implements Callable<Integer>
{
@Override
public Integer call() throws Exception
{
System.out.println("*******come in call");
return 1024;
}
}
public class CallableDemo
{
public static void main(String[] args) throws InterruptedException, ExecutionException
{
FutureTask futureTask = new FutureTask(new MyThread());
new Thread(futureTask,"A").start();
System.out.println(futureTask.get());
}
}
来源:CSDN
作者:# Never Give up &
链接:https://blog.csdn.net/qq_41939020/article/details/103614115