java面试常问的Runnable和Callable的区别

网友投稿 254 2022-09-04


java面试常问的Runnable和Callable的区别

Runnable

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

// 函数式接口

@FunctionalInterface

public interface Runnable {

public abstract void run();

}

Callable

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

/**

* @author yinfeng

* @description 自己实现futureTask,基于park/unpark进行线程通讯

* @since 2022/1/9 21:32

*/

public class MyFutureTask implements Runnable {

Callable callable;

/**

* callable执行结果

*/

T result;

/**

* task执行状态

*/

String state = "new";

/**

* 存储正在等待的消费者

*/

LinkedBlockingQueue waiters = new LinkedBlockingQueue<>();

publicjllPLt MyFutureTask(Callable callable) {

this.callable = callable;

}

@Override

public void run() {

try {

result = callable.call();

} catch (Exception e) {

e.printStackTrace();

} finally {

state = "end";

}

// 任务执行完成后通过unpark通知消费者

System.out.println(Thread.currentThread().getName() + " 生产者执行结束,通知消费者");

while (true) {

Thread waiter = waiters.poll();

if (waiter == null) {

break;

}

LockSupport.unpark(waiter);

}

}

/**

* park / unpark

*/

public T get() throws Exception {

Thread mainThread = Thread.currentThread();

// 塞入等待的集合中

waiters.add(mainThread);

// 判断状态

System.out.println(Thread.currentThread().getName() + " 消费者进入等待");

while (!"end".equals(state)) {

// 阻塞等待任务执行完成后通知

LockSupport.park(mainThread);

}

return result;

}

}

我们写个demo测试一下

/**

* @author yinfeng

* @description

* @since 2022/1/9 21:32

*/

public class FutureTaskTest {

public static void main(String[] args) throws Exception {

final MyFutureTask futureTask = new MyFutureTask<>(() -> {

Thread.sleep(5000);

return "任务完成888";

});

new Thread(futureTask).start();

final String result = futureTask.get();

System.out.println("结果:"+result);

// 控制台打印如下:

http:// // main 消费者进入等待

// Thread-0 生产者执行结束,通知消费者

// 结果:任务完成888

}

}

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Python的列表推导式(Python列表推导式,并解释它的作用)
下一篇:Python 的异步 IO:Asyncio(python是什么意思)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~