Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么线程按这种顺序工作?_Java_Multithreading - Fatal编程技术网

Java 为什么线程按这种顺序工作?

Java 为什么线程按这种顺序工作?,java,multithreading,Java,Multithreading,我有三门课:Main、Caller和CallMe调用方实现可运行。我将指向CallMe实例的指针传递给CallMe构造函数,并将Caller传递给打印消息的CallMe实例方法的消息传递给该方法。接下来,我开始一个线程 在Main中,我创建了Caller和I的3个实例,但在这里它将被打印: [Welcome] [to synchronized] [world!] 但我得到了以下结果: [Welcome] [world!] [to synchronized] 为什么? 有代码: Main.ja

我有三门课:MainCallerCallMe调用方实现可运行。我将指向CallMe实例的指针传递给CallMe构造函数,并将Caller传递给打印消息的CallMe实例方法的消息传递给该方法。接下来,我开始一个线程

Main中,我创建了Caller和I的3个实例,但在这里它将被打印:

[Welcome]
[to synchronized]
[world!]
但我得到了以下结果:

[Welcome]
[world!]
[to synchronized]
为什么?

有代码:

Main.java

Caller.java

CallMe.java


main方法中调用方的三个实例化可能都发生在一个时间片内,即不向另一个线程屈服。这将导致创建所有三个线程并将其置于可运行状态。在那之后,线程可以按任何顺序调度,所以你只是运气不好


如果希望线程按特定顺序执行,则需要自己提供联锁逻辑。

主方法中调用方的三个实例化可能都发生在一个时间片内,即不向另一个线程屈服。这将导致创建所有三个线程并将其置于可运行状态。在那之后,线程可以按任何顺序调度,所以你只是运气不好


如果希望线程按特定顺序执行,则需要自己提供联锁逻辑。

为什么希望线程按特定顺序运行?按顺序创建它们并不能保证它们按顺序执行。@DanielGibbs我认为按顺序创建它们可以设置线程的执行顺序。不,一点也不。请阅读。为什么您希望它们按特定顺序运行?按顺序创建它们并不能保证它们按顺序执行。@DanielGibbs我认为按顺序创建它们可以设置线程的执行顺序。不,一点也不。当然,我读过《AndyTurner》,但我认为这是多线程编程中的自我教育。我认为“只做一个线程!”是一个非常有用的东西,可以被认为是一个选项。当然,AndyTurner,但我认为这是多线程编程中的自我教育。我想“只需在一个线程中完成它。”学习是一个非常有用的事情。
public class Main {
    public static void main(String[] args) {
        CallMe target = new CallMe();
        Caller ob1 = new Caller(target, "Welcome");
        Caller ob2 = new Caller(target, "to synchronized");
        Caller ob3 = new Caller(target, "world!");

        try {
            ob1.thread.join();
            ob2.thread.join();
            ob3.thread.join();
        } catch (InterruptedException exc) {
            System.out.println(exc);
        }
    }
}
public class Caller implements Runnable {
    String message;
    CallMe target;
    Thread thread;

    public Caller(CallMe target, String message) {
        this.target = target;
        this.message = message;
        this.thread = new Thread(this);
        this.thread.start();
    }

    public void run() {
        synchronized (target) {
            target.call(message);
        }
    }
}
public class CallMe {    
    public void call(String msg) {
        System.out.print("[" + msg);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException exc) {
            System.out.println(exc);
        }
        System.out.println("]");
    }
}