2012-03-21 58 views
0

我創建了一個啓動線程的GUI,它可以做一些非常簡單的事情。但是,子線程永遠不會啓動。子線程不啓動

子線程,如果啓動,將提供一些輸出;儘管我沒有得到任何輸出。我錯過了什麼?

下面的代碼:

  1. 的GUI類:

    import java.awt.FlowLayout; 
    import java.awt.event.ActionEvent; 
    import java.awt.event.ActionListener; 
    import javax.swing.JButton; 
    import javax.swing.JFrame; 
    
    
    public class gui { 
        public static void main(String [] args) {   
         //final standalone s = new standalone(); 
         final try2 t= new try2(); 
    
         JFrame win = new JFrame(); 
         win.setLayout(new FlowLayout()); 
    
         JButton start = new JButton("Start"); 
         JButton stop = new JButton("Stop"); 
    
         start.addActionListener(new ActionListener() { 
    
          @Override 
          public void actionPerformed(ActionEvent e) { 
           // TODO Auto-generated method stub 
           t.t.start(); 
           System.out.println("M on!"); 
           try{ 
           Thread.currentThread().sleep(10000); 
           }catch(Exception e1) 
           { 
            e1.printStackTrace(); 
           } 
           System.out.println("M off!"); 
           if(t.t.isInterrupted()) 
            System.out.println("Stopped"); 
          } 
         });   
    
         win.add(start); 
         win.add(stop); 
    
         win.setVisible(true); 
        } 
    } 
    
  2. 這裏是子線程

    public class try2 implements Runnable { 
        public Thread t; 
        int i; 
    
        try2() { 
         t=new Thread();    
        } 
    
        public void run() { 
         System.out.println(++i); 
        } 
    } 
    
+0

脫離主題的建議:閱讀Java命名約定。類應該被命名爲「LikeThisName」,而不是「likethisname」。 – bezmax 2012-03-21 07:48:37

+0

您沒有覆蓋try2.t中的運行方法 – styfle 2012-03-21 07:49:59

+0

您可以在線程上加入()以等待它結束,而不是睡眠10秒。 – 2012-03-21 09:31:11

回答

1

使類try2擴展Thread(並刪除即時消息請致電Runnable),然後只需在您的try2實例上調用start()即可。

+1

擴展'線程'不是最佳實踐。你應該實現'Runnable'並把它放到'Thread'的構造函數中。這裏的解釋:http://stackoverflow.com/questions/541487/java-implements-runnable-vs-extends-thread – bezmax 2012-03-21 07:52:27

+0

這也是我的偏好,但對於這樣一個簡單的情況,這有點矯枉過正。 – 2012-03-21 08:02:04

+1

不是。而不是'threadObject.start()'你寫'新線程(runnableObject).start()'。沒有那麼多的矯枉過正。一個矯枉過正的做法是使用'ExecutorService'(這實際上是首選)來執行這樣簡單的任務。 – bezmax 2012-03-21 08:04:07

3

當您致電t.t.start()時,它將啓動try2對象的t字段中的線程對象。不幸的是,這個線程沒有Runnable,所以當你啓動它時,它會立即退出。不調用try2.run()方法,因爲線程對此一無所知。

您的代碼很複雜。我會簡化/修復它如下:

  1. 擺脫try2.t字段。

  2. actionPerformed方法創建和運行線程如下:

    new Thread(t).start(); 
    

    其中t是你try2實例。

雖然在修復代碼時,try2違反了我所遇到過的所有Java風格指南。類名應始終以大寫字母開頭。養成這樣做的習慣吧...

0

你的類try2應該擴展Thread(並實現run()方法) 你正在處理它的方式,yuo正在調用run()方法try2中的線程對象t。但是這個對象的run()方法是空的。

+0

擴展'Thread'是個不錯的主意。實現'Runnable'是一個首選的方法。更多信息在這裏:http:// stackoverflow。com/questions/541487/java-implements -unnnable-vs-extends-thread – bezmax 2012-03-21 07:53:27

+0

感謝您提供此信息。到現在爲止還沒有想過...... – AlexS 2012-03-21 10:51:58