我正在重构一些代码,我一直在寻找下面的代码:
for (int i = 0; i < NumSortThreads; i++) {
logger.info("Starting sorting thread " + (i) + "/"
+ NumSortThreads + "... ");
sorter = new FooSorter(batchQueue, fooQue, RsaveQueue,
minSamples);
Sorter = new Thread(sorter);
Sorter.start();
}
你能以这种方式重用一个线程对象吗?这很重要,因为稍后我会终止线程(使用对象的一个方法)并且我不确定它是否会实际杀死所有生成的线程。
我找不到关于这个问题的任何文档,但是根据我所知道的Java,我会假设每次调用new Thread(obj)
时,它都会杀死前一个线程。这部分是基于这样一个事实:我知道java为Thread Groups提供了另一个对象(原作者可能会这样做)。
此代码是否会生成NumSortThreads
个帖子?或者由于重复实例化而只产生一个?
答案 0 :(得分:2)
您的代码正在重用变量Sorter
,而不是它引用的线程对象。一旦重新分配变量
Sorter = new Thread(sorter);
它开始引用一个新的线程对象,并停止引用旧的线程。
因此,如果我调用sorter.terminate()(一个让对象停止处理的方法),它会成功杀死所有的Sorter线程吗?
不,因为每个线程对象都在构造函数
中为其分配了单独的FooSorter
sorter = new FooSorter(batchQueue, fooQue, RsaveQueue, minSamples);
Sorter = new Thread(sorter); // <<== each thread gets a new FooSorter
这将终止最后一个线程。如果您想终止所有线程,您需要将它们放在一个集合中,并以与创建它们相同的方式调用terminate
,即在循环中。
答案 1 :(得分:0)
你能以这种方式重用一个线程对象吗?这很重要,因为稍后我会终止线程(使用对象的一个方法)并且我不确定它是否会实际杀死所有生成的线程。
您没有重用线程对象。您只是重用Thread类型的引用。请注意,由于您重复使用引用,因此不会引用任何先前的线程对象,并且可以自由地进行GC。
此代码是否产生NumSortThreads线程?或者由于重复实例化而只产生一个?
这将创建NumSortThreads线程。但是在给定的时间点,不要指望有很多人能够运行,因为正如我所说的那样没有实时参考,他们将被GC。