子线程无法启动

时间:2012-03-21 07:40:06

标签: java multithreading

我已经创建了一个用于启动Thread的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. 这是Child Thread

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

3 个答案:

答案 0 :(得分:3)

当您致电t.t.start()时,它会在t对象的try2字段中启动线程对象。不幸的是,这个线程没有Runnable,所以当你启动它时,它会立即退出。不调用try2.run()方法,因为线程对此一无所知。

您的代码令人费解。我将如下简化/修复它:

  1. 摆脱try2.t字段。

  2. actionPerformed方法中,按如下方式创建并运行线程:

      new Thread(t).start();
    

    其中t是您的try2个实例。

  3. 在修复代码时,try2违反了我遇到过的所有Java风格指南。类名应始终以大写字母开头。养成做正确的习惯......

答案 1 :(得分:1)

让你的类try2扩展Thread(并删除实现Runnable)。然后只需在try2实例上调用start()

答案 2 :(得分:0)

你的类try2应该扩展Thread(并实现方法run()) 你正在处理它的方式,yuo正在try2中调用thread-Object的run()方法。但是这个对象的run() - 方法是空的。