给定打印字母a-C的三个线程1-3,如何保证输出顺序?
我希望线程的输出是“abcabc”
我的解决方案是:可以修改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();
}
}
}
}
}
这可能不是线程应该做的,但是,它可以通过简单地使用连接来实现(它要求启动线程等待启动线程的完成。
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();
}
}
}
线程独立运行,所以除非您执行特殊的努力来同步线程,否则您永远不会得到这样的输出。独立运行的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的字段(表示应该执行哪个线