Cra*_*lus 6 java multithreading executorservice threadpool executors
我对以下内容感到困惑:
要在Java程序中使用线程,最简单的方法是扩展Thread类并实现runnable接口(或简单地实现runnable).
启动线程的执行.我们必须调用Thread的方法start(),然后调用线程的方法run().所以线程开始了.
方法start()(除非我错了)必须完全调用,每个线程只调用一次.因此,线程实例不能被重用,除非某种方式运行方法本身在某个短的无限循环中运行,这有利于自定义实现线程的重用.
现在javadoc
链接文本
说
如果可用,执行调用将重用先前构造的线程
我不明白这是如何实现的.我在执行方法的execute方法中提供了我的自定义线程,例如
ExecutorService myCachedPool = Executors.newCachedThreadPool();
myCachedPool.execute(new Runnable(){public void run(){
//do something time consuming
}});
Run Code Online (Sandbox Code Playgroud)
如何重用我删除到执行程序框架的自定义线程?
Executor是否允许调用方法start()超过1次,而我们不能在我们的程序中?我误会了什么吗?
谢谢.
请注意,它不是Executor
调用start()
-是ExecutorService
。不,它没有打电话start()
两次。它不会启动您直接使用Thread.start()
...分配的任务,而是启动一个知道该线程池工作队列的线程。线程基本上会等到要做一些工作,然后再选择并执行它,然后再返回等待状态。因此,尽管线程执行多项任务,但Thread.start()
仅被调用一次。
编辑:从评论来看,您对Runnable
(要执行的任务)和Thread
(要执行任务的)之间的区别感到困惑。
同一线程可以执行多个任务。对于不使用线程池的非常简单的示例,请考虑以下事项:
public class MultiRunnable implements Runnable
{
private final List<Runnable> runnables;
public MultiRunnable(List<Runnable> runnables)
{
this.runnables = runnables;
}
public void run()
{
for (Runnable runnable : runnables)
{
runnable.run();
}
}
}
Run Code Online (Sandbox Code Playgroud)
(忽略List<T>
从多个线程使用a的潜在线程安全问题。)
您可以创建一堆Runnable
能够执行不同任务的任务,然后创建一个任务MultiRunnable
以依次运行它们。将该实例传递MultiRunnable
给Thread
构造函数,然后在启动线程时,它将执行每个原始的可运行任务。有帮助吗?
它不是多次调用start(); 相反,池中的线程永远不会完成,但只是保持活着---等待.如果您想查看源代码,可以下载源代码.
线程池中的每个线程都可以简单地wait()
让Executor为它提供一个新的Runnable,但Thread自己的run()
方法还没有完成.它只是等待一个新的Runnable被提供给Executor.
归档时间: |
|
查看次数: |
2897 次 |
最近记录: |