为什么每次运行程序时都会提供不同的输出。
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方法
答案 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();