在for循环中重用Thread Object

时间:2014-05-20 16:29:13

标签: java multithreading concurrency refactoring

我正在重构一些代码,我一直在寻找下面的代码:

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个帖子?或者由于重复实例化而只产生一个?

2 个答案:

答案 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。