0


面试题之Runnable和Callable的区别

Runnable

Runnable接口非常简单,就定义了一个方法run(), 实现Runnable接口的run方法就可以实现多线程

  1. // 函数式接口@FunctionalInterfacepublicinterfaceRunnable{publicabstractvoidrun();}

Callable

可能很多人都知道要想在多线程中获取异步返回值结果一般是用Callable和FutureTask接口来实现,但可能很多人都不知道其实Callable是依赖于Runnable的run方法进行执行任务的,然后在通过FutureTask来收集返回值结果,下面咱们就自己模拟写一份FutureTask代码来看看是怎么实现的吧。

  1. /**
  2. * @author yinfeng
  3. * @description 自己实现futureTask,基于park/unpark进行线程通讯
  4. * @since 2022/1/9 21:32
  5. */publicclassMyFutureTask<T>implementsRunnable{
  6. Callable<T> callable;/**
  7. * callable执行结果
  8. */
  9. T result;/**
  10. * task执行状态
  11. */
  12. String state ="new";/**
  13. * 存储正在等待的消费者
  14. */
  15. LinkedBlockingQueue<Thread> waiters =newLinkedBlockingQueue<>();publicTonyFutureTask(Callable<T> callable){this.callable = callable;}@Overridepublicvoidrun(){try{
  16. result = callable.call();}catch(Exception e){
  17. e.printStackTrace();}finally{
  18. state ="end";}// 任务执行完成后通过unpark通知消费者
  19. System.out.println(Thread.currentThread().getName()+" 生产者执行结束,通知消费者");while(true){
  20. Thread waiter = waiters.poll();if(waiter == null){break;}
  21. LockSupport.unpark(waiter);}}/**
  22. * park / unpark
  23. */public T get()throws Exception {
  24. Thread mainThread = Thread.currentThread();// 塞入等待的集合中
  25. waiters.add(mainThread);// 判断状态
  26. System.out.println(Thread.currentThread().getName()+" 消费者进入等待");while(!"end".equals(state)){// 阻塞等待任务执行完成后通知
  27. LockSupport.park(mainThread);}return result;}}

我们写个demo测试一下

  1. /**
  2. * @author yinfeng
  3. * @description
  4. * @since 2022/1/9 21:32
  5. */publicclassFutureTaskTest{publicstaticvoidmain(String[] args)throws Exception {final MyFutureTask<String> futureTask =newMyFutureTask<>(()->{
  6. Thread.sleep(5000);return"任务完成888";});newThread(futureTask).start();final String result = futureTask.get();
  7. System.out.println("结果:"+result);// 控制台打印如下: // main 消费者进入等待// Thread-0 生产者执行结束,通知消费者// 结果:任务完成888}}

可以看到我们的demo也是正常运行的,所以很关键的一点还是Callable是依赖于Runnable的run方法进行执行任务的

标签: java juc intellij-idea

本文转载自: https://blog.csdn.net/a1774381324/article/details/121578160
版权归原作者 隐 风 所有, 如有侵权,请联系我们删除。

“面试题之Runnable和Callable的区别”的评论:

还没有评论