Java中的线程混淆

时间:2015-04-05 21:14:19

标签: java multithreading

此代码根本不打印主线程。它只是打印子线程。但是,如果我做了一个更改,即将语句“r.t.start()”从此try块中取出并将其放入自己的try块中。所以,当我这样做时,线程就像它们应该的那样工作。为什么会这样?

public class prctc2 {

    public static void main(String args[]) {
        NewThread r = new NewThread();
        try {
            r.t.start();
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + i);
                Thread.sleep(1000);
            }
        } catch (Exception e) {}
    }

}

class NewThread implements Runnable {
    Thread t;

    NewThread() {
        t = new Thread(this, "new one");
    }

    public void run() {

        try {
            for (int i = 1; i <= 5; i++) {
                System.out.println(t + " " + i);
                Thread.sleep(500);
            }

        }

        catch (Exception e) {}
    }

}

1 个答案:

答案 0 :(得分:0)

不是答案:但我对您的计划进行了一些更改,使其看起来更专业:

prctc2更改为Prctc2。类名应始终大写。

我将Thread t成员从NewThread课程中取出。一个班级应该始终只对一件事负责:你的责任是两个:第一个责任是打印出从1到5的数字,第二个责任是启动线程。

我将.start()调用移至main(),其中(IMO)使代码更易于理解。

我将NewThread重命名为MyTask。它不是不是一个线程,并且由于我上面的更改,它甚至不再拥有一个线程,因此“thread”不应出现在其名称中。

我更改了异常处理程序以打印堆栈跟踪。您可以做的最糟糕的事情之一是忽略异常。如果你做了一些你不希望它做的事情,这可能会让你很难调试你的程序。

public class Prctc2 {
    public static void main(String args[]) {
        Thread r = new Thread(new MyTask());
        r.start();

        try {
            for (int i = 1; i <= 5; i++) {
                System.out.println(Thread.currentThread().getName() + i);
                Thread.sleep(1000);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class MyTask implements Runnable {
    public void run() {
        try {
            for (int i = 1; i <= 5; i++) {
                System.out.println(t + " " + i);
                Thread.sleep(500);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}