Java之Callable和Runnable

举报
chenyu 发表于 2021/07/27 00:18:51 2021/07/27
【摘要】 1 接口定义  1) Callable接口 public interface Callable<V> { V call() throws Exception;} 2) Runnable接口 public interface Runnable { public abstract void run();}     2 不同点...

1 接口定义 

1) Callable接口


      public interface Callable<V> {
      V call() throws Exception;
      }
  
 

2) Runnable接口


      public interface Runnable {
      public abstract void run();
      }
  
 

 

 

2 不同点和相同点

1)相同点

都是接口,都可编写多线程程序,都是调用Thread.start()启动线程

 

2)不同点

Callable可以返回执行结果,是个泛型,与Future、FutureTask配合可以通过FutureTask.get()获取异步执行的结果,但是Runnable不可以。

Callable里面有取消这个任务,而且异常可以外抛,但是Runnable异常只能内部run消化。

FutureTask.get()得到异步执行的结果,此方法会阻塞主进程的继续往下执行。

 

 

 

3 Callable测试用例


      import java.util.Random;
      import java.util.concurrent.Callable;
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.FutureTask;
      public class TestCallableAndFuture {
      public static void main(String[] args) {
      //构建Callable
      Callable<String> callable = new Callable<String>() {
       @Override
      public String call() throws Exception {
      Thread.sleep(2000);
      return "chenyu callable finish";
       }
       };
      //构建FutureTask
      FutureTask<String> futureTask = new FutureTask<>(callable);
      //运行线程
       new Thread(futureTask).start();
      try {
      System.out.println("chenyu begin");
      System.out.println(futureTask.isDone());
      //futureTask.cancel(true);
      if (!futureTask.isCancelled()) {
      System.out.println(futureTask.get());
      System.out.println(futureTask.isDone());
      System.out.println("chenyu end");
       } else {
      System.out.println("the thread is cancel");
       }
       } catch (InterruptedException e) {
       e.printStackTrace();
       } catch (ExecutionException e) {
       e.printStackTrace();
       }
       }
      }
  
 

 

 

 

 

 

4 运行结果

如果注释掉// futureTask.cancel(true)运行结果如下


      chenyu begin
      false
      chenyu callable finish
      true
      chenyu end
  
 

如果不注释掉futureTask.cancel(true)运行结果如下


      chenyu begin
      false
      the thread is cancel
  
 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/103077029

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。