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命名约定来提出好的问题。变量以小写字母开头。我们还可以通过使方法同步来确保线程安全:-@也许设置另一个线程的名称不是最好的主意。