Thread.start()没有初始化run()

时间:2014-01-08 14:28:03

标签: java multithreading swing

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

我在这段代码之间有很多东西,但是这是线程和框架必不可少的部分。

5 个答案:

答案 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

        }
    });