java - 如果两个线程正在等待进入一个同步方法,当互斥量被释放时,它们是否按照它们到达的顺序执行?

标签 java multithreading

如果我有一个同步方法并且两个线程正在等待进入它,它们似乎进入了后进先执行的线程。有没有办法让这个先入先出?

这是我正在使用的单元测试:

package com.test.thread;

import org.apache.log4j.Logger;
import org.junit.Test;

public class ThreadTest {
    private static final Logger log = Logger.getLogger(ThreadTest.class);

    @Test
    public void testThreading() throws InterruptedException {
        Thread t1 = new Thread(new Runnable() {    
            public void run() { synchd("1"); }
        });
        Thread t2 = new Thread(new Runnable() {    
            public void run() { synchd("2"); }
        });
        Thread t3 = new Thread(new Runnable() {    
            public void run() { synchd("3"); }
        });

        t3.start();
        Thread.sleep(5);
        t1.start();
        t2.start();

        Thread.sleep(12000);
    }

    public static synchronized void synchd(String output) {
        log.debug(output);
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // do nothing
        }

    }
}

此输出始终为 3、2、1,我想找到一种方法使其成为 3、1、2。

最佳答案

不,它们不是按照到达的顺序执行的。

执行顺序取决于与线程调度相关的许多参数,并且通常是不可预测的。

关于java - 如果两个线程正在等待进入一个同步方法,当互斥量被释放时,它们是否按照它们到达的顺序执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6961834/

相关文章:

java - 当我复制文件时,LastModified 值在 Mac 上没有更改?

java - 在后端传递浏览器选项卡信息?

java - java中的守护线程及其进程空间

mysql - 带线程的 Perl 邮件队列 'out of memory'

java - Java 应用程序如何在关闭时自行重启?

java - java中最好的多部分base64编码器是什么?

java - Java中数组的文件列表

python - 如何在 Python 3.x 中中止读取用户的输入?

c# - 暂停和恢复下载 WPF

c# - 多线程