gpt4 book ai didi

java - 跟踪执行器服务中的线程

转载 作者:行者123 更新时间:2023-12-01 22:59:17 24 4
gpt4 key购买 nike

首先:虽然我了解一些基础知识(至少我认为),但我总体上对线程不太熟悉。

现在,使用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 个线程。

有没有可能的方法让新线程位于之前的第三个位置?或者当服务有空间容纳更多线程时,线程按什么顺序执行。

我想知道这一点,因为我想实现某种“线程表”,您可以在其中看到哪些线程正在运行,哪些没有运行(类似于任务管理器,但技术性较低)/advanced,仅用于简单的网络爬虫)。

提前致谢,如果这是一个非常“菜鸟”或愚蠢的问题,请不要责怪我,因为我对线程缺乏经验,只是想知道这是否可能。

最佳答案

so the ExecutorService starts a new thread to top up the maximum of 5 threads again.

不,它会保持相同的 5 个线程运行,直到您关闭池,即使这些线程没有任何事可做。

Is there a possible way of getting the new thread on that previously third position?

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

Or in what order do threads get executed when the service has room for more threads.

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

I'd like to know this, because I want to implement some kind of 'thread table', in which you can see which Threads are running and which aren't (something similar to a task manager, but way less technical/advanced, just for a simple webcrawler).

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

enter image description here

[how to detect when it] "execute a new task".

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

 protected void beforeExecute(Thread t, Runnable r)

当线程即将启动 Runnable 时,它​​会让您知道

 protected void afterExecute(Runnable r, Throwable t)

当任务完成时调用。

关于java - 跟踪执行器服务中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23565170/

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