Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Concurrency - Fatal编程技术网

两个或多个线程的java多线程并发?

两个或多个线程的java多线程并发?,java,multithreading,concurrency,Java,Multithreading,Concurrency,那么, 我在努力理解这个案子。当我创建两个线程共享同一个Runnable实例时。这是为什么 Hello from Thread t 0 Hello from Thread u 1 Hello from Thread t 2 Hello from Thread t 4 Hello from Thread u 3 <----| this is not in order Hello from Thread u 6 Hello from Thread t 5 <----| this one

那么, 我在努力理解这个案子。当我创建两个线程共享同一个Runnable实例时。这是为什么

Hello from Thread t 0
Hello from Thread u 1
Hello from Thread t 2
Hello from Thread t 4
Hello from Thread u 3 <----| this is not in order
Hello from Thread u 6
Hello from Thread t 5 <----| this one too
Hello from Thread t 8
Hello from Thread t 9
Hello from Thread t 10
最后,最后一个问题是,如果我在运行这个线程,我知道它们不是按顺序运行的,而是按顺序运行的。为什么一个线程在无序地保存或打印一个数字

这是runnable的代码:

class HelloRunnerShared implements Runnable{
    int i=0;
    public void run(){
        String name = Thread.currentThread().getName();
        while (i< 300) {
            System.out.println("Hello from " + name + " " + i++);
        }
    }
}
类hellorRunnershared实现可运行{
int i=0;
公开募捐{
字符串名称=Thread.currentThread().getName();
而(i<300){
System.out.println(“Hello from”+name+“”+i++);
}
}
}
我以为它们会被加工成夹层。这只是一个假设


谢谢

为什么您认为线程应该按特定顺序执行?这是一个不确定的现象——无论哪个先计划,都会先运行


如果您想让事情以固定的顺序运行,而不管它们的日程安排如何,请使用ExecutorService.invokeAll。

有几件事情正在进行:

  • 操作系统调度程序可以随时在线程之间切换。没有公平性要求,调度程序可能会倾向于一个线程而不是另一个线程(例如,它可能试图最小化上下文切换的数量)

  • 唯一正在进行的锁定是println方法使用的PrintStream,它防止线程同时写入控制台。当取决于OS调度程序时,哪个线程获取PrintStream上的锁。使用的锁是与synchronized关键字一起使用的内在锁,它们是不公平的。调度程序可以将锁授予上次使用它的同一线程

  • ++这不是一个原子操作。这两个线程可以互相妨碍更新i。您可以使用而不是int

  • 对i的访问不受锁或任何其他强制执行before边界的方法的保护,因此对它的更新可能对其他线程可见,也可能对其他线程不可见。仅仅因为一个线程更新了,我并不意味着另一个线程会立即看到更新的值,或者根本看不到(JVM对此的宽容程度取决于实现)。在没有发生边界的情况下,JVM可以进行优化,如重新排序字节码或执行主动缓存


发布线程正在运行的代码?(
HelloRunnerShared
)这完全取决于哪个线程首先获得CPU。每次运行程序时,顺序可能会有所不同。如果要维护订单,请将生产者/消费者与等待/通知一起使用,或使用高级并发API ExecutorServicepost将HellorRunnershared的代码class@sunrise76是的,你说得对,我想我明白了!我想我应该插进来。这就是为什么他们发明了(sleep())来获取数据。orderCalling sleep()是一种被普遍接受的错误做法,原因有很多,通常被用作糟糕设计的支柱。不必亲自列出,我将引导您阅读这篇文章:@AnandDwivedi,
sleep()
从不修复任何东西。如果
sleep()。它仍然可能发生,如果它最终发生,它将出现在客户站点而不是您的测试设备中。如果我希望以固定的顺序执行某些内容,我应该考虑线程以外的其他解决方案。
class HelloRunnerShared implements Runnable{
    int i=0;
    public void run(){
        String name = Thread.currentThread().getName();
        while (i< 300) {
            System.out.println("Hello from " + name + " " + i++);
        }
    }
}