关键词搜索

源码搜索 ×
×

Java之Callable和Runnable

发布2019-11-14浏览1893次

详情内容

1 接口定义 

1) Callable接口

  1. public interface Callable<V> {
  2. V call() throws Exception;
  3. }

2) Runnable接口

  1. public interface Runnable {
  2. public abstract void run();
  3. }

 

 

2 不同点和相同点

1)相同点

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

 

2)不同点

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

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

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

 

 

 

3 Callable测试用例

  1. import java.util.Random;
  2. import java.util.concurrent.Callable;
  3. import java.util.concurrent.ExecutionException;
  4. import java.util.concurrent.FutureTask;
  5. public class TestCallableAndFuture {
  6. public static void main(String[] args) {
  7. //构建Callable
  8. Callable<String> callable = new Callable<String>() {
  9. @Override
  10. public String call() throws Exception {
  11. Thread.sleep(2000);
  12. return "chenyu callable finish";
  13. }
  14. };
  15. //构建FutureTask
  16. FutureTask<String> futureTask = new FutureTask<>(callable);
  17. //运行线程
  18. new Thread(futureTask).start();
  19. try {
  20. System.out.println("chenyu begin");
  21. System.out.println(futureTask.isDone());
  22. //futureTask.cancel(true);
  23. if (!futureTask.isCancelled()) {
  24. System.out.println(futureTask.get());
  25. System.out.println(futureTask.isDone());
  26. System.out.println("chenyu end");
  27. } else {
  28. System.out.println("the thread is cancel");
  29. }
  30. } catch (InterruptedException e) {
  31. e.printStackTrace();
  32. } catch (ExecutionException e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. }

 

 

 

 

 

4 运行结果

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

  1. chenyu begin
  2. false
  3. chenyu callable finish
  4. true
  5. chenyu end

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

  1. chenyu begin
  2. false
  3. the thread is cancel

 

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载