我的代码有一些问题。由于某种原因,我的 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");
}
}
我在这个代码之间和下面得到了很多东西,但这是线程和框架唯一必不可少的部分。
您必须Runnable
传递Thread
。由于thread
是一个实例变量并且该类实现了Runnable
我想你想这样做:
Thread thread = new Thread(this);
但是,从构造函数调用可重写方法时要小心,如果这些方法由单独的线程调用,该线程在构造函数初始化的 parralel 中运行代码,则要更加小心。它可能在构造函数仍初始化对象时运行。想想如果你的子类Screen
,重写run
方法,并且run方法在初始化时访问超类Screen
的属性,会发生什么。
另请参阅构造函数中可重写的方法调用有什么问题?
这是因为您的线程不知道 run 方法。您可以通过更改来做到这一点
Thread thread = new Thread();
自
Thread thread = new Thread(this);
因为你的类是 Runnable 的实例。
附言尽量避免弄乱线程和 Swing。如果你真的需要,请使用SwingWorkers。
Thread 需要一个Runnable
实例,该实例具有要调用run()
方法。但是您没有向Thread
提供Runnable
实例。
做Thread t = new Thread(this);
您正在创建一个简单的线程。
Thread thread = new Thread();
它确实调用run()
但调用类 Thread
的方法,而不是 Screen 类可运行的实现。
你可以做
Thread thread = new Thread(new Screen());
您有两种解决方案:
1) 在类中使用覆盖run
方法
Thread thread = new Thread(this);
2) 使用new Runnable
Thread th = new Thread(new Runnable() {
@Override
public void run() {
// your code
}
});