Java 子线程未启动
我已经创建了一个GUI来启动一个线程,它可以做一些非常简单的事情。但是,子线程从未启动 子线程如果启动,将给出一些输出;但是我没有得到任何输出。我错过了什么 代码如下: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
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
是首选方法。更多信息请点击此处: