2017-04-23 25 views
0

执行命令this.setVisible(false)时,它是否停止专门在该框架上运行的所有线程?JFrame setVisibility(false)是否停止我创建的所有线程?

如果没有,是否有一种简单的方法可以自动停止它们?

+1

你是什么意思“所有线程”? Swing程序中只有一个线程,除非您使用例如'new Thread()'或'new SwingWorker()'。 – Radiodef

+0

是的,我做了新的线程(),也是一个线程线程=新的线程()。 –

+1

嗯,Swing程序中的两个线程:主线程(启动程序)和EDT(Event Dispatch Thread),其中所有Swing操作都应该发生。 – markspace

回答

1

我认为,我们在这里有一个概念性的问题。没有“在JFrame上运行的线程”。有一个线程,the Event Dispatch Thread,运行ALL Swing对象,框架等

的EDT(事件指派线程)不停止,因为你做一个窗口不可见。但是,如果ALL Swing对象变得无法访问(有资格进行垃圾回收),那么Swing EDT会关闭。 (该应用程序音符下面链接说,你也可以拨打一个框架上Window.dispose(),使其不可显示的。然后,它不再计数保持EDT运行)

shutting down the EDT are in this app-note:

Starting with 1.4, the behavior has changed as a result of the fix for 
4030718. With the current implementation, AWT terminates all its helper 
threads allowing the application to exit cleanly when the following 
three conditions are true: 

    There are no displayable AWT or Swing components. 
    There are no native events in the native event queue. 
    There are no AWT events in java EventQueues. 

更精确的条件在Java 1.4之前,EDT永远不会关闭。希望你不需要那么远。

如果你想关闭一组线程,你必须手动执行(除了使用一些课程方法,如System.exit())。我会看看Executors,它使您能够相当容易地管理线程。

+0

这是我需要的,谢谢。另外,我指的是新的Thread()类型的线程。 –

+0

那么,所有的线程基本上是相同的,但如果你的意思是以'new Thread()。start()'开头的线程,那么当隐藏窗口时,那些线程不会关闭。 – markspace

-1

不,它不!

线程仍然在后台运行,但您不能与框架交互。 停止所有线程,你可以这样做:

System.exit(1)这将终止所有线程或每个线程 Thread.sleep(10000000000);这将停止线程一定量的时间(毫秒)。

0

不,将JFrame可见性设置为false将不会停止使用new Thread()创建的所有线程。

如果没有,是否有一种简单的方法可以自动停止它们?

要停止所有的人都自动是没有办法(除非终止所有程序)

你需要将它们存储在一个列表或载体,例如,然后使用方法Thread.interrupt()

事情是这样的:

for(Thread thread : threads) //where threads is a List 
{ 
    thread.interrupt(); 
}