这个线程中的引用在哪里?

时间:2014-05-02 15:00:23

标签: java multithreading

我想开始学习Java。我即将编写一个非常基本的程序,我想在无限循环中显示一系列数字(1,2,3,4,5 ... .etc)。如果有人按特定键(Say ESCAPE键),程序应该退出。所以我想到将Threads用于这两个任务(无限循环和用户绑定)。我只有一个无限循环的线程,这就是我的代码的样子:

public class LearnJava implements Runnable {

    private int i = 0;
    private boolean running = false;
    private Thread counter;

    public void start(){
        running = true;
        counter = new Thread(this);
        counter.start();
    }

    /*the stop method is not really in use yet*/
    public void stop(){
        running = false;
        try{
            counter.join();
        } 
        catch (InterruptedException e){
            e.printStackTrace();
        }
    }

    public void run(){
        while (running){
            System.out.println("ThreadTest: " + i);
            i++;        
        }

    }

    public LearnJava(){
    }

    public static void main(String[] args){
        LearnJava programm = new LearnJava();
        programm.start();
    }

}

现在我在自己的例子中不理解的是我的Thread中的“this”引用。我总是尝试在没有任何参考的情况下运行它,因为我不知道它的原因。老实说,我只是随机得到了正确的代码。我自己写了一遍,并且想要正确地理解它,但显然我不是。任何人都可以解释为什么我需要在行中采用“this”参考:

counter = new Thread(this);

2 个答案:

答案 0 :(得分:5)

请注意,您已实施Runnable界面?当你说new Thread(this)时,你说"创建一个新线程,它将在启动时运行我的班级"

看一下Thread的documentation,你会看到一个带Runnable的构造函数。

答案 1 :(得分:3)

马修G没有错。答案,但是再多一点......

......一个有很多课程的课程,每个课程只有一个职责通常比一个课程有很多职责的课程要好。我知道你刚开始学习语言,但现在开始学习好习惯还为时尚早。

这是一种你会经常在其他人的java代码中看到的模式:

Thread fooThread = new Thread(new Runnable(){
    @Override
    public void run() {
        ...do something interesting here...
    }
});

这将创建一个实现Runnable接口的 anonymous 类的新实例。它看起来可能不是很多,但是如果你在LearnJava.start()方法中使用它,那么你的LearnJava类的责任就会减少:它不必实现run()方法。