Java 为什么不';线程是否一致运行?
我正在玩多线程,在运行一小段代码时遇到了不一致的情况。以下代码应打印出123123。。。但我得到的是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 <
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;irun
的线程,或者即使它开始执行,也不意味着这是第一个到达System.out.print
调用的线程
考虑到相当长的睡眠时间,我希望(但理想情况下不依赖)输出是一个由7个“块”组成的序列,其中每个“块”以某种排列方式由字符“123”组成。但是,如果你有三个线程,它们都在“大致”相同的时间进入睡眠状态一秒钟,你不应该期望它们一定会以1、2、3的顺序醒来——即使它们醒来,其中一个线程也可能会在循环体中抢先另一个线程
在一台速度非常非常慢的机器上,即使这种期望也是无效的——想象一下调用charAt
需要0到20秒之间的随机时间——不太可能,但这是一个可行的思维实验。此时,其中一个线程可以抢先完成输出,然后另一个线程才能打印任何内容
线程被设计为独立的——如果你想让它们以协调的方式工作,你必须自己指定协调。这项工作有很多工具,但不要指望它会神奇地发生。你无法预测一次运行的程序CPU是什么。当运行某个进程时,CPU将该进程转换为小块的
工作
。因为一次运行多个进程。CPU必须根据执行的调度算法进行调度。因此,简而言之,除非以编程方式同步代码片段,否则无法预测CPU下一步将做什么。它们是线程,不是调度线程,而是JVM/OS。而且,股票Java不是实时的;睡眠计数和切换的细微差别将改变结果。要添加到@DaveNewton的注释中,您必须确保3个线程通过使用同步或一个锁依次执行。我可以将这个问题转化为:“为什么当我使东西并行运行时,它不会按顺序发生?”我喜欢思维实验。