在Executor Service中跟踪Thread

时间:2014-05-09 12:53:03

标签: java multithreading executorservice

首先:虽然我知道一些基础知识(至少,我认为),但我并不熟悉线程。

现在,在使用ExecutorService创建FixedThreadPool之后,是否可以跟踪某个位置'在这个线程池?

示例:

创建一个新的线程池:

ExecutorService es = Executors.newFixedThreadPool(5);

开始一些线程:

for (int i = 0; i < 10; i++) {
    es.execute(new Runnable()); //Implementation does not matter
}

现在,将会发生5个线程将​​被执行,而其他5个线程将​​被排队。让我们说第3个已启动的线程已完成,因此ExecutorService启动一个任务线程以再次补充最多5个线程。

是否有可能将新线程置于之前的第三个位置?或者当服务有更多线程的空间时,以什么顺序执行线程。

我想知道这一点,因为我想实现某种类型的线程表,在其中你可以看到哪些线程正在运行,哪些线程没有运行(类似的东西)到一个任务管理员,但不那么技术/高级,只是为了一个简单的webcrawler)。

先谢谢你,如果这是一个非常“非常”的人,请不要责备我。或者是愚蠢的问题,因为我对线程很少有经验,只想知道这是否可行。

1 个答案:

答案 0 :(得分:3)

  

所以ExecutorService启动一个新线程,再次补充最多5个线程。

不,它会保持相同的5个线程运行,直到你关闭池,即使这些线程无关。

  

是否有可能将新主题放在之前的第三个位置?

使用ThreadFactory,您可以根据需要创建每个线程,例如更改线程名称,或使其成为守护程序。正如我所提到的,没有创建,所以你不会被告知。

  

当服务有更多线程的空间时,线程是以什么顺序执行的。

在您有任何作业之前,池会创建5个线程,并且它们会继续运行。这样没有免费的插槽。

  

我想知道这一点,因为我想实现某种类型的线程表,在其中你可以看到哪些线程正在运行,哪些线程没有运行(类似的东西)到一个任务管理员,但不那么技术/高级,只是为了一个简单的webcrawler)。

我建议使用VisualVM。它显示了所有正在运行/阻塞/等待的线程等。为线程提供有意义的名称非常有用。 ;)

enter image description here

  

[如何检测它]&#34;执行新任务&#34;。

您可以对ThreadPoolExecutor进行子类化。它有两种方法

 protected void beforeExecute(Thread t, Runnable r)

可以让你知道什么时候线程即将启动Runnable和

 protected void afterExecute(Runnable r, Throwable t)

在任务完成时调用。