gpt4 book ai didi

通过执行器重用java线程

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:15 25 4
gpt4 key购买 nike

我对以下内容感到困惑:
要在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com