我的代码有些问题。由于某种原因,我的thread.start()不会激活我的run()方法。在纯粹的绝望中,我只是用run()替换了我的代码,但是没有打印任何内容。有人可以通过解释我的代码中的错误来帮助我吗?
public class Screen extends JPanel implements Runnable{
Thread thread = new Thread();
Frame frame;
public Screen(Frame frame){
this.frame = frame;
frame.setSize(horizontal * 25 + 24 , (vertical) * 25 + 48);
this.frame.addKeyListener(new KeyHandler(this));
thread.start();
}
public void run(){
System.out.println("Boom");
}
}
我在这段代码之间有很多东西,但是这是线程和框架必不可少的部分。
答案 0 :(得分:4)
您必须通过Thread
一个Runnable
。由于thread
是一个实例变量而类实现Runnable
,我想你想这样做:
Thread thread = new Thread(this);
但是从构造函数中调用可覆盖的方法时要小心,如果这些方法是由运行parralel中的代码到构造函数初始化的单独线程调用的,那就要小心了。它可能在构造函数仍初始化对象时运行。想想如果你继承Screen
会发生什么,覆盖run
方法,并且run方法在初始化时访问超类Screen
的属性。
另见What's wrong with overridable method calls in constructors?
答案 1 :(得分:0)
这是因为你的线程不知道run方法。你可以通过改变
来做到这一点Thread thread = new Thread();
到
Thread thread = new Thread(this);
因为你的类是Runnable的一个实例。
P.S。尽量避免搞乱线程和Swing。如果你真的需要,请使用SwingWorkers。
答案 2 :(得分:0)
线程需要一个Runnable
实例,该实例具有run()
方法来调用。但您没有向Runnable
提供Thread
个实例。
执行Thread t = new Thread(this);
答案 3 :(得分:0)
您正在创建一个简单的线程。
Thread thread = new Thread();
它会调用run()
方法,但调用类Thread
,而不是调用Screen类可运行的实现。
你可以做到
Thread thread = new Thread(new Screen());
答案 4 :(得分:0)
您有两种解决方案:
1)在班级中使用覆盖run
方法
Thread thread = new Thread(this);
2)使用new Runnable
Thread th = new Thread(new Runnable() {
@Override
public void run() {
// your code
}
});