Java 为什么不';线程是否一致运行?

Java 为什么不';线程是否一致运行?,java,multithreading,thread-sleep,Java,Multithreading,Thread Sleep,我正在玩多线程,在运行一小段代码时遇到了不一致的情况。以下代码应打印出123123。。。但我得到的是 class RunnableDemo implements Runnable { private String message; RunnableDemo(String m) { message = m; } public void run() { try { for (int i = 0; i <

我正在玩多线程,在运行一小段代码时遇到了不一致的情况。以下代码应打印出123123。。。但我得到的是

class RunnableDemo implements Runnable {
    private String message;

    RunnableDemo(String m) {
        message = m;
    }

    public void run() {
        try {
            for (int i = 0; i < message.length(); i++) {
                System.out.print(message.charAt(i));
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

}

public class TestThread {
    public static void main(String args[]) throws InterruptedException {

        new Thread(new RunnableDemo("1111111")).start();
        new Thread(new RunnableDemo("2222222")).start();
        new Thread(new RunnableDemo("3333333")).start();

    }
}
类RunnableDemo实现Runnable{ 私有字符串消息; RunnableDemo(字符串m){ 消息=m; } 公开募捐{ 试一试{ 对于(int i=0;i 输出:123231132123231321

输出:12321123123213213

输出:123231213231213

我不明白的是,它第一次正确运行(打印'123'),但第二次正确运行时打印'231'。如果线程正在打印字符,则休眠1秒,然后重复。模式123123不应该。。。每次运行代码时保持一致,或者至少遵循前3个字符的模式

以下代码应打印出123123

不一定。您基本上不应该依赖于线程之间没有同步的情况下以任何特定顺序唤醒和执行

让我们看一下第一个字符的输出:不能保证它是1。是的,您首先开始线程打印1,但这并不意味着这是第一个真正开始执行
run
的线程,或者即使它开始执行,也不意味着这是第一个到达
System.out.print
调用的线程

考虑到相当长的睡眠时间,我希望(但理想情况下不依赖)输出是一个由7个“块”组成的序列,其中每个“块”以某种排列方式由字符“123”组成。但是,如果你有三个线程,它们都在“大致”相同的时间进入睡眠状态一秒钟,你不应该期望它们一定会以1、2、3的顺序醒来——即使它们醒来,其中一个线程也可能会在循环体中抢先另一个线程

在一台速度非常非常慢的机器上,即使这种期望也是无效的——想象一下调用
charAt
需要0到20秒之间的随机时间——不太可能,但这是一个可行的思维实验。此时,其中一个线程可以抢先完成输出,然后另一个线程才能打印任何内容


线程被设计为独立的——如果你想让它们以协调的方式工作,你必须自己指定协调。这项工作有很多工具,但不要指望它会神奇地发生。

你无法预测一次运行的程序CPU是什么。当运行某个进程时,CPU将该进程转换为小块的
工作
。因为一次运行多个进程。CPU必须根据执行的调度算法进行调度。因此,简而言之,除非以编程方式同步代码片段,否则无法预测CPU下一步将做什么。

它们是线程,不是调度线程,而是JVM/OS。而且,股票Java不是实时的;睡眠计数和切换的细微差别将改变结果。要添加到@DaveNewton的注释中,您必须确保3个线程通过使用
同步
或一个锁依次执行。我可以将这个问题转化为:“为什么当我使东西并行运行时,它不会按顺序发生?”我喜欢思维实验。