2016-05-31 149 views
1

我已经实现了一个SwingWorker在while循环中执行一些操作。SwingWorker(线程)不会死亡(到达“return null;”后仍然存在)?

worker = new SwingWorker<Void, String>() 
    { 
     public Void doInBackground() 
     { 
      while(!this.isCancelled()) 
      { 
       //perform operations 
      } 
      return null; 
     } 


    }; 
    worker.execute(); 

我想取消SwingWorker,因此保留对“worker”的引用并使用它的cancel方法。

取消基本上可以正常工作(=“return null;”已到达),但相应的线程在取消之后似乎仍然存在(如在eclipse中的调试窗口中所示),并占用资源。

所以开始几个工作线程,并取消他们停在while循环执行的操作后,让他们活着,他们还积累了大量的内存,即使它们不再被使用。

我不希望他们被取消后,线程是活着的,我是不是就在这里错过了什么?

任何帮助表示赞赏!

回答

2

这是它是如何工作的。 SwingWorker在引擎盖下使用线程池 - 这意味着您不是通过创建SwingWorker来直接创建线程。整个过程就是让这些线程“可重用”,因为创建线程非常昂贵。所以你有一堆“工作者线程”会为你执行一些任务。

请注意,如果您在第一个完成后执行另一个SwingWorker且工作线程(您在调试程序中看到的线程)处于空闲状态,则该任务将由该线程执行,以确保创建新线程。

不要担心资源。如果工作线程在一段时间内不会使用,那么工作线程池将关闭工作线程。

+0

事实上,在我的计划,应该是空闲的(因为他们达到了“返回NULL;”?和什么都没有做我想)的线程不会接管另一个即将到来的SwingWorker任务的工作。即使我使用SwingWorker并重用它的“.execute()”方法。实际上,一个新的线程被创建。这就是我真正想要避免的! 说我有一个程序,用户按下一个按钮,然后一个回转工人不断计算出一些东西。按下另一个按钮后,Swingworker应停止计算并死亡,或者至少保持空闲状态,并接管下一次按下第一个按钮时的计算任务... – freeprogramer233

+0

。 在我的程序,按下第一个按钮,第二个和重复此过程5次,它会创建5级不同的线程占用显著内存,而不是只重用一个SwingWorker的线程5次或每第二个按钮被按下时杀死它并按下第一个按钮创建一个新的(开始计算)。 – freeprogramer233

+0

@ freeprogramer233好吧,也许你是以错误的方式使用SwingWorker,或者你认为在之前的工作完成后你会发起新的工作,但事实并非如此,或者它只是执行的判断! 如果你真的不满意SwingWorker的工作方式,你总是可以使用严格的deterministict ExecutorService--你会将'Runnbale'提交给保证执行新'SwingWorkers'的线程池。祝你好运! – Antoniossss