调用Runnable的run()方法是否每次执行都会创建新线程?
问题解答
结论
你的理解完全正确,wrapper.getTask().run()不会创建额外线程,所有duration为0的即时任务都会在调用GET()方法的当前线程中实时同步执行,不会产生额外的线程开销,不会导致运行负载异常升高。
原理说明
Runnable接口的run()本身只是普通的方法定义,直接调用run()和调用普通自定义类的成员方法没有任何区别,代码会在当前调用线程上下文中串行执行,完全不会涉及线程创建逻辑。- 只有将
Runnable实例交给Thread.start()、线程池的submit/schedule等方法时,才会由JVM或者线程池负责创建新线程(或复用池化线程)执行任务逻辑,你代码中只有异步延迟任务会走这个分支。
补充注意点
你当前的实现还有两个特点可以留意:
- 所有通过
addSync添加的任务会严格按照添加顺序串行执行,前一个同步任务执行完成后才会执行下一个任务,也才会继续提交后续的异步任务 - 你调用的
ThreadPoolManager.scheduleEvent只要是标准的线程池调度实现,本身也不会每次调用都创建新线程,而是复用线程池内的存活线程,本身也不会有频繁创建线程的开销
内容的提问来源于stack exchange,提问作者Girls are beautiful
相关产品推荐
相关产品推荐

