Java 运行简单线程程序时的不同输出
为什么每次我运行程序时它都会给出不同的输出Java 运行简单线程程序时的不同输出,java,multithreading,Java,Multithreading,为什么每次我运行程序时它都会给出不同的输出 package threading; class RunnableDemo implements Runnable { @Override public void run() { go(); } public void go() { String name = Thread.currentThread().getName(); System.out.println(na
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线程未显示其设置的名称
输出
Job2Run方法
主要方法
Thread-1Run方法正如@anonymous指出的那样,一个线程设置了两次 相反,你应该这样做
Thread job1 = new Thread(myJob, "Job1");
Thread job2 = new Thread(myJob, "Job2");
为什么每次我运行程序时它都会给出不同的输出
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");
}
}
你能解释一下你预期会发生什么吗?根据设计,您已经启动了两个独立的线程,它们可以以任何顺序运行
什么是线程不安全的
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);
}
这意味着您可以在一个线程中设置值,但更改不可见
注意:在这种情况下,这不是问题,因为您在线程启动之前设置了名称。线程启动前写入的任何内容都保证可见。您没有设置Job2线程的名称:
Job1.setName("Job1");
Job1.setName("Job2");
Job1.start();
Job2.start();
正确答案是:
Job1.setName("Job1");
Job2.setName("Job2");
Job1.start();
Job2.start();
因为你有两次job1.setName!!请花一些时间通过适当缩进代码并遵守Java命名约定来提出好的问题。变量以小写字母开头。我们还可以通过使方法同步来确保线程安全:-@也许设置另一个线程的名称不是最好的主意。