JUC(五)——Callable

ⅰ亾dé卋堺 提交于 2019-12-19 22:05:04

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());
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!