首先:虽然我知道一些基础知识(至少,我认为),但我并不熟悉线程。
现在,在使用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)。
先谢谢你,如果这是一个非常“非常”的人,请不要责备我。或者是愚蠢的问题,因为我对线程很少有经验,只想知道这是否可行。
答案 0 :(得分:3)
所以ExecutorService启动一个新线程,再次补充最多5个线程。
不,它会保持相同的5个线程运行,直到你关闭池,即使这些线程无关。
是否有可能将新主题放在之前的第三个位置?
使用ThreadFactory,您可以根据需要创建每个线程,例如更改线程名称,或使其成为守护程序。正如我所提到的,没有创建,所以你不会被告知。
当服务有更多线程的空间时,线程是以什么顺序执行的。
在您有任何作业之前,池会创建5个线程,并且它们会继续运行。这样没有免费的插槽。
我想知道这一点,因为我想实现某种类型的线程表,在其中你可以看到哪些线程正在运行,哪些线程没有运行(类似的东西)到一个任务管理员,但不那么技术/高级,只是为了一个简单的webcrawler)。
我建议使用VisualVM。它显示了所有正在运行/阻塞/等待的线程等。为线程提供有意义的名称非常有用。 ;)
[如何检测它]&#34;执行新任务&#34;。
您可以对ThreadPoolExecutor进行子类化。它有两种方法
protected void beforeExecute(Thread t, Runnable r)
可以让你知道什么时候线程即将启动Runnable和
protected void afterExecute(Runnable r, Throwable t)
在任务完成时调用。