- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我对以下内容感到困惑:
要在 Java 程序中使用线程,最简单的方法是扩展 Thread 类并实现 runnable 接口(interface)(或简单地实现 runnable)。
开始线程的执行。我们必须调用 Thread 的方法 start(),它又调用线程的方法 run()。因此线程开始。
start() 方法(除非我错了)必须为每个线程准确且仅调用一次。因此,线程实例不能被重用,除非 run 方法本身以某种方式运行在某种短的无限循环中,这有助于线程重用的自定义实现。
现在是javadoc link text 说
Calls to execute will reuse previously constructed threads if available
我不明白这是如何实现的。我在执行程序方法的执行方法中提供了我的自定义线程,例如
ExecutorService myCachedPool = Executors.newCachedThreadPool();
myCachedPool.execute(new Runnable(){public void run(){
//do something time consuming
}});
如何重用我委托(delegate)给执行器框架的这个自定义线程?
是否允许 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();
}
}
}
(忽略从多个线程使用 List<T>
的潜在线程安全问题。)
您可以创建一大堆 Runnable
任务能够做不同的事情,然后创建一个单一的MultiRunnable
依次运行它们。传递 MultiRunnable
的实例进入Thread
构造函数,然后当你启动线程时,它会执行每一个原来的可运行任务。这有帮助吗?
关于通过执行器重用java线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3745376/
我是一名优秀的程序员,十分优秀!