gpt4 book ai didi

java - 3个线程按顺序打印数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:11:41 25 4
gpt4 key购买 nike

我正在尝试编写一个简单的代码来按顺序打印数字。场景就像

Thread  Number
T1 1
T2 2
T3 3
T1 4
T2 5
T3 6
T1 7
T2 8
T3 9
...and so on.

这里是

public class ThreadNumberPrinter {

Object monitor = new Object();
AtomicInteger number = new AtomicInteger(1);

public static void main(String[] args) {
ThreadNumberPrinter tnp = new ThreadNumberPrinter();
Thread t1 = new Thread(tnp.new Printer(1, 3));
Thread t2 = new Thread(tnp.new Printer(2, 3));
Thread t3 = new Thread(tnp.new Printer(3, 3));

t3.start();
t1.start();
t2.start();
}

class Printer implements Runnable {

int threadId;
int numOfThreads;

public Printer(int id, int nubOfThreads) {
threadId = id;
this.numOfThreads = nubOfThreads;
}

public void run() {
print();
}

private void print() {
try {
while (true) {
Thread.sleep(1000l);
synchronized (monitor) {
if (number.get() % numOfThreads != threadId) {
monitor.wait();
} else {
System.out.println("ThreadId [" + threadId
+ "] printing -->"
+ number.getAndIncrement());
monitor.notifyAll();
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

}

但是就在第二个线程运行并打印数字 2 之后,所有线程都进入等待阶段并且什么也没有打印。我不确定我哪里做错了。任何帮助将不胜感激。

最佳答案

  public class TestClass {

private volatile Integer count = 1;
private volatile Integer threadIdToRun = 1;
private Object object = new Object();

public static void main(String[] args) {

TestClass testClass = new TestClass();
Thread t1 = new Thread(testClass.new Printer(1));
Thread t2 = new Thread(testClass.new Printer(2));
Thread t3 = new Thread(testClass.new Printer(3));

t1.start();
t2.start();
t3.start();
}

class Printer implements Runnable {

private int threadId;

public Printer(int threadId) {
super();
this.threadId = threadId;
}

@Override
public void run() {
try {
while (count <= 20) {
synchronized (object) {
if (threadId != threadIdToRun) {
object.wait();
} else {
System.out.println("Thread " + threadId + " printed " + count);
count += 1;

if (threadId == 1)
threadIdToRun = 2;
else if (threadId == 2)
threadIdToRun = 3;
else if (threadId == 3)
threadIdToRun = 1;

object.notifyAll();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}

}
}
}

以上程序给出输出

Thread 1 printed 1
Thread 2 printed 2
Thread 3 printed 3
Thread 1 printed 4
Thread 2 printed 5
Thread 3 printed 6
Thread 1 printed 7
Thread 2 printed 8
Thread 3 printed 9
Thread 1 printed 10
Thread 2 printed 11
Thread 3 printed 12
Thread 1 printed 13
Thread 2 printed 14
Thread 3 printed 15
Thread 1 printed 16
Thread 2 printed 17
Thread 3 printed 18
Thread 1 printed 19
Thread 2 printed 20

关于java - 3个线程按顺序打印数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com