Thread.start() 不初始化 run()



我的代码有一些问题。由于某种原因,我的 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
        }
    });

最新更新