当前位置: 首页 > 知识库问答 >
问题:

如何确保Java线程按特定顺序运行

南宫泓
2023-03-14

给定打印字母a-C的三个线程1-3,如何保证输出顺序?

我希望线程的输出是“abcabc”

共有3个答案

叶英哲
2023-03-14

我的解决方案是:可以修改https://gist.github.com/sinujohn/5fa717dfff680634c6b0c2a7eca108ac来实现这一点。想法是创建一个保存状态的对象,并在所有线程之间共享该对象。只有一个同步块可以访问共享状态对象。

public class Main {

    public static void main(String[] args) throws InterruptedException {
        MyState state = new MyState();

        final Thread t1 = new Thread(new MyRunnable(10, 'A', state));
        final Thread t2 = new Thread(new MyRunnable(10, 'B', state));
        final Thread t3 = new Thread(new MyRunnable(10, 'C', state));
        t1.start();
        t2.start();
        t3.start();
    }
}

class MyState {
    private char state = 'A';

    public char getState() {
        return state;
    }

    public void incrState() {
        switch(state) {
        case 'A':
            state = 'B';
            return;
        case 'B':
            state = 'C';
            return;
        default:
            state = 'A';
        }
    }
}

class MyRunnable implements Runnable {

    private final int max;
    private final char value;
    private final MyState state;

    MyRunnable(int max, char value, MyState state) {
        this.max = max;
        this.value = value;
        this.state = state;
    }

    @Override
    public void run() {
        int count = 0;
        while(count < max) {
            synchronized (this.state) {
                if (this.state.getState() == this.value) {
                    System.out.print(value);
                    count++;
                    this.state.incrState();
                }
            }
        }
    }
}
岳景明
2023-03-14

这可能不是线程应该做的,但是,它可以通过简单地使用连接来实现(它要求启动线程等待启动线程的完成。

class A implements Runnable {

@Override
public void run() {
    try {
        Thread.sleep(12);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("ClassA : A");
}

}

class B implements Runnable {

@Override
public void run() {
    try {
        Thread.sleep(12);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("ClassB : B");
}

}

class C implements Runnable {

@Override
public void run() {
    try {
        Thread.sleep(12);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("ClassC : C");
}

}

public class OrderedThreadApp {
public static void main(String[] args) {

    Thread a = new Thread(new A());
    Thread b = new Thread(new B());
    Thread c = new Thread(new C());

    a.start();
    try {
        a.join();
        b.start();
        b.join();
        c.start();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
}
刘兴朝
2023-03-14

线程独立运行,所以除非您执行特殊的努力来同步线程,否则您永远不会得到这样的输出。独立运行的3个线程预计会打印“随机”输出,因为由操作系统来调度线程。

 类似资料:
  • 如何按特定顺序运行quarkus测试?通常我们有@InSequence注释(来自arquillian IIRC),我们可以实现这一点。 但是我没有找到任何类似的Quarkus在"org.junit.jupiter.api"软件包提供Quarkus-朱尼5。 它将以一个替代的顺序运行,我试图使用org.junit.jupiter.api.顺序与@Testmetodorder(方法命令。nnotati

  • 问题内容: 我有一些测试UI的测试,也可以用来创建数据。 单独的一组测试依赖于此数据,这意味着这些测试必须仅在第一组运行之后才能运行。 我知道要运行一组或使用标签运行它们,但是如何按特定顺序运行它们呢? 问题答案: Nightwatch将按顺序运行特定文件中的每个测试,因此(一个简单的)解决方案是将每个测试按您希望它们运行的​​顺序放入同一文件中。 如果单个文件的测试太多,这将变得很麻烦。要解决此

  • 问题内容: 我正在尝试在我正在处理的Python项目中使用线程,但是线程似乎没有按照我的代码的预期运行。似乎所有线程都按顺序运行(即,线程2在线程1结束后开始,它们不是同时启动)。我编写了一个简单的脚本来对此进行测试,并且该脚本也按顺序运行线程。 这是我从运行它得到的输出: 循环的迭代次数更多时,观察到相同的行为。 我尝试搜索网络和较早的SO答案,但找不到任何有帮助的方法。有人可以指出这段代码有什

  • 问题内容: 您将如何依次执行三个线程?例如。线程1,线程2,线程3。不可能将一个线程的引用传递给另一个线程并从run()方法调用。 因此代码应如下所示: 并应该把 这可以通过使用ThreadPoolExecutor并使用阻塞队列来实现,但即使那样也不是可以接受的答案。 问题答案: 在java.util.concurrent包中使用ExecutorService。更精确地使用

  • 问题内容: 我有3个线程第一打印A第二打印B第三打印C 我想按顺序打印ABCABCABC,依此类推..... 因此,我在下面编写了程序,但无法实现相同的目的。我知道一个问题,当时状态为1时,例如B1和C1线程正在等待,而当我做notifyAll()时,两个等待线程都被唤醒,并且取决于CPU分配,它可能会打印B或C。 在这种情况下,我只希望在A之后打印B。 我需要做什么修改。 问题答案: 将那些IF

  • 在我的应用程序中,在程序的整个生命周期中,有n个操作必须依次发生。我决定为每个操作创建一个线程,让它们执行一次run方法,然后等待所有其他线程都执行相同的操作,等待轮到它,然后再次执行,依此类推,而不是创建实现这些操作的方法并在while(true)循环中按顺序调用它们。。。 为了实现这个机制,我创建了一个名为StatusHolder的类,它有一个名为threadTurn的字段(表示应该执行哪个线