通过执行程序的java线程重用

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次,而我们不能在我们的程序中?我误会了什么吗?

谢谢.

Jon*_*eet 5

请注意,它不是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以依次运行它们。将该实例传递MultiRunnableThread构造函数,然后在启动线程时,它将执行每个原始的可运行任务。有帮助吗?


jbi*_*del 5

它不是多次调用start(); 相反,池中的线程永远不会完成,但只是保持活着---等待.如果您想查看源代码,可以下载源代码.

线程池中的每个线程都可以简单地wait()让Executor为它提供一个新的Runnable,但Thread自己的run()方法还没有完成.它只是等待一个新的Runnable被提供给Executor.

  • 您的Runnable将不会重新实例化.您的Runnable实例将被提供给池中的一个线程.该线程有自己的`run()`方法,它不能(不能)被Runnable的`run()`方法替换.Thread的run()方法将调用你的`Runnable`的`run()`方法,然后在你的`Runnable.run()`完成之后,线程将最终(有一些必须完成的簿记)go回到'等待'. (2认同)