【问题标题】:JAVA - ScheduledExecutorService don't quits threadsJAVA - ScheduledExecutorService 不退出线程
【发布时间】:2014-04-25 03:49:57
【问题描述】:

我正在使用 ScheduledExecutorService.scheduleWithFixedDelay() 来安排线程的定期启动。它可以工作,但线程正在 ThreadStackTrace 中累积(处于等待状态)。我确定定期启动的线程已经完成,请参见示例。

谁能告诉我如何定期启动线程并解决这个问题?

class TestThread extends Thread{
    @Override
    public void run(){
        int countThreads =  Thread.getAllStackTraces().keySet().size();
        int running = 0;
        for (Thread t : Thread.getAllStackTraces().keySet()) {
            if (t.getState()==Thread.State.RUNNABLE) running++;
            System.out.println(t.getName()+" "+t.getState().toString());
        }        
        System.out.println("TotalThreads:"+countThreads+" Running:"+running+"\n\n");            
    }


}
public class JavaApplication2 {
    private static final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(10);

    public static void main(String[] args) {        
        scheduler.scheduleWithFixedDelay(new TestThread(), 0, 10, TimeUnit.SECONDS);
    }    
}

非常感谢

【问题讨论】:

  • 考虑implements Runnable 而不是extends Thread

标签: java multithreading executorservice


【解决方案1】:

您创建了一个包含 10 个线程的池。 ExecutorService 将根据需要创建它们并将任务排队。线程等待任务可用(或准备好执行),其中一个收到通知并执行它。您看到的行为似乎表明它的实现方式是为前 10 个任务创建 10 个线程,然后重新使用它们。

不知道你想解决什么问题。

【讨论】:

  • 另外,也无需将Thread 传递给ExecutorServiceRunnable 绰绰有余。事实上,在这种情况下,它也不必要地昂贵。
  • 顺便说一句,我认为 OP 没有意识到 ExecutorService 旨在重用线程,即将它们保留在内存中以备将来使用。
  • @GiovanniBotta 对。这是因为 Thread 实现了 Runnable. 至于重用,我试图在第一段中解释这一点。希望 OP 明白这一点。
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-14
相关资源
最近更新 更多