运行简单线程程序时的不同输出

时间:2014-04-13 07:43:31

标签: java multithreading

为什么每次运行程序时都会提供不同的输出。

package threading;
class RunnableDemo implements Runnable {

    @Override
    public void run() {
        go();
    }

    public void go() {
        String name = Thread.currentThread().getName();
        System.out.println(name + "Run method");
    }
}

public class multiThreading {
    public static void main(String[] args) {
        Runnable myJob = new RunnableDemo();
        Thread job1 = new Thread(myJob);
        Thread job2 = new Thread(myJob);
        job1.setName("Job1");
        job2.setName("Job2");
        job1.start();
        job2.start();
        System.out.println("Main Method");
    }
}

Job1 Thread也没有显示其设置名称。

输出

Job2Run方法
  主要方法
  Thread-1Run方法

2 个答案:

答案 0 :(得分:0)

正如@anonymous指出你设置了一个线程两次。

相反,你应该做

Thread job1 = new Thread(myJob, "Job1");
Thread job2 = new Thread(myJob, "Job2");
  

为什么每次运行程序时都会提供不同的输出。

你能解释一下你预期会发生什么吗?您已经启动了两个可以按任何顺序运行的独立线程。


  

什么不是线程安全的?

Thread.setName()和Thread.getName()不是线程安全的。来自消息来源

private char        name[];

public final void setName(String name) {
    checkAccess();
    this.name = name.toCharArray();
}

public final String getName() {
    return String.valueOf(name);
}

这意味着您可以在一个线程中设置值,但不能看到更改。

注意:在这种情况下,它不是问题,因为您在线程是start()ed之前设置了名称。在线程启动之前写的任何内容都保证可见。

答案 1 :(得分:0)

您没有设置Job2线程的名称:

Job1.setName("Job1");
Job1.setName("Job2");
Job1.start();
Job2.start();

正确的是:

Job1.setName("Job1");
Job2.setName("Job2");
Job1.start();
Job2.start();