Java 子线程未启动

Java 子线程未启动,java,multithreading,Java,Multithreading,我已经创建了一个GUI来启动一个线程,它可以做一些非常简单的事情。但是,子线程从未启动 子线程如果启动,将给出一些输出;但是我没有得到任何输出。我错过了什么 代码如下: GUI类: import java.awt.FlowLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; p

我已经创建了一个GUI来启动一个线程,它可以做一些非常简单的事情。但是,子线程从未启动

子线程如果启动,将给出一些输出;但是我没有得到任何输出。我错过了什么

代码如下:

  • 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);
        }
    }
    
  • 这是子线程

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

  • 使类try2扩展
    线程(并移除实现
    可运行
    ),然后在try2实例上简单地调用
    开始()

    使类try2扩展
    线程
    (并移除实现
    可运行
    ),然后简单地调用
    开始()
    在try2实例上。

    当调用
    t.t.start()
    时,它将在
    try2
    对象的
    t
    字段中启动线程对象。不幸的是,此线程没有可运行的
    ,因此当您启动它时,它将立即退出。未调用
    try2.run()
    方法,因为线程对此一无所知

    你的代码很复杂。我将简化/修复它,如下所示:

      new Thread(t).start();
    
  • 去掉
    try2.t
    字段

  • actionPerformed
    方法中,创建并运行线程,如下所示:

      new Thread(t).start();
    
    其中
    t
    是您的
    try2
    实例


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

    调用
    t.t.start()
    时,它正在启动
    try2
    对象的
    t
    字段中的线程对象。不幸的是,此线程没有可运行的,因此当您启动它时,它将立即退出。未调用
    try2.run()
    方法,因为线程对此一无所知

    你的代码很复杂。我将简化/修复它,如下所示:

      new Thread(t).start();
    
  • 去掉
    try2.t
    字段

  • actionPerformed
    方法中,创建并运行线程,如下所示:

      new Thread(t).start();
    
    其中
    t
    是您的
    try2
    实例


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

    类try2应该扩展线程(并实现run()方法)
    处理它的方式是,在try2中调用线程对象t的run()-方法。但是此对象的run()方法为空。

    您的类try2应该扩展Thread(并实现run()方法)
    处理它的方式是,在try2中调用线程对象t的run()-方法。但是这个对象的run()方法是空的。

    Offtopic友好建议:阅读Java命名约定。类应该命名为
    LikeThisName
    ,而不是
    LikeThisName
    。您没有在try2中重写run方法。t您可以在线程上加入()等待它完成。Offtopic友好建议:阅读Java命名约定。类应命名为
    LikeThisName
    ,而不是
    LikeThisName
    。您没有在try2中重写run方法。t您可以在线程上加入()以等待它完成。扩展
    thread
    不是最佳做法。您应该实现
    Runnable
    ,并将其放入
    线程的构造函数中。这里的解释是:这也是我的偏好,但对于这样一个简单的案例,这有点过头了。不是真的。而不是
    threadObject.start()
    编写
    新线程(runnableObject.start()
    。没那么过分。对于这样简单的任务,过度使用
    ExecutorService
    (这实际上是首选)是一种方法。扩展
    线程
    不是最佳做法。您应该实现
    Runnable
    ,并将其放入
    线程的构造函数中。这里的解释是:这也是我的偏好,但对于这样一个简单的案例,这有点过头了。不是真的。而不是
    threadObject.start()
    编写
    新线程(runnableObject.start()
    。没那么过分。对于这样简单的任务,过度使用
    ExecutorService
    (这实际上是首选)是一个好主意。扩展
    Thread
    是一个坏主意。实现
    Runnable
    是首选方法。这里有更多信息:扩展
    线程
    是个坏主意。实现
    Runnable
    是首选方法。更多信息请点击此处: