2011-08-02 40 views
1

因此,在本節的代碼中,我基本上要告訴GUI禁用按鈕,並在沒有線程運行時彈出一個彈出窗口(例如,調用的方法has完成)。在Java GUI中使用線程數

public void actionPerformed(ActionEvent event) 
{ 
    String command = event.getActionCommand(); 

    //If btnConvertDocuments is clicked, the FileConverter method is called and the button is then disabled [so as to prevent duplicates]. 
    if (command.equals("w")) 
    { 
     new Thread(new Runnable() 
     { 
      public void run() 
      { 
       FileConverter fc = new FileConverter(); 

      } 
     }).start(); 
     if (Thread.activeCount() == 0) 
     { 
      btnConvertDocuments.setEnabled(false); 
      //Validation message ensuring completion of the step. 
      JOptionPane.showMessageDialog(this, "Step 1 Complete!", "Validation", JOptionPane.INFORMATION_MESSAGE); 
     } 
    } 

爲什麼if (Thread.activeCount() == 0)似乎永遠不會被調用?這不是我想要完成我的目標嗎?提前感謝您的任何意見!

+0

作爲替代直接使用線程,你可能想看看['ExecutorService'(HTTP://下載。 oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html)和['Future '](http://download.oracle.com/javase/6/docs/api/java/ UTIL /併發/ Future.html)。 –

回答

2

如果你想檢查一個線程的狀態,使用getState()方法(只記得分配給它),當你運行一個Java程序(例如,主線程:)並且看起來here)線程一個Thread變量:

 Thread t = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       FileConverter fc = new FileConverter(); 

      } 
     }); 
     t.start(); 
     if (t.getState().equals(Thread.State.TERMINATED)) { ... } 

尋找更進了你的問題,直到t完成(或直至超時),你可以調用join方法爲好,因爲它會阻止當前線程

+0

因此,在getState()方法的條件中,我會說什麼? –

+0

您可以將它與其中一個線程狀態進行比較:http://download.oracle.com/javase/7/docs/api/java/lang/Thread.State.html – MByD

+0

所以它會像......'if( t1.getState()。TERMINATED!= null)'...? –

2

。那大約是Concurency in Swing,好一點d是包你BackGroung任務的SwingWorker,非常漂亮例如通過@Hovercraft Full Of Eels,或器具Executorhere

+0

+1這是我沒有考慮到的事情(這是一個可怕的錯誤......) – MByD

+0

與我剛纔使用的連接相比,使用此執行程序的差異究竟是什麼? –

+0

@ This 0ne Pr0grammer with Executor(s)you can play with MultiThreading,but with using SwingWorker is most important that you GUI does not freeze during BackGround Task(s),JComponents all accesible,but other hand say that I must say你也可能會這樣做,但解決方法稍微複雜一點,看看這裏http://stackoverflow.com/questions/6051755/java-wait-cursor-display-problem/6060678#6060678 – mKorbel