2017-04-23 79 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(); 
}