gpt4 book ai didi

java - 如何让我的线程按顺序运行?

转载 作者:行者123 更新时间:2023-11-30 10:04:46 24 4
gpt4 key购买 nike

我正在学习 Java 线程并希望我的代码按顺序输出线程 0-9。我使用了 synchronized 关键字,但没有得到预期的结果。

我应该怎么做才能更正我的代码?

public class MyThread extends Thread {

private static final int threadMax = 10;
private static int runCount = 0;

public void printThread() {
synchronized (this) {
while (runCount++ < 100) {
System.out.println(runCount + ": " + Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

public void run() {

printThread();

}

public static void main(String[] args) {

for (int i = 0; i < threadMax; i++) {
new MyThread().start();
}

}

}

最佳答案

每次您创建新的 MyThread 对象时,它都无法正常工作,并且您会在该新对象上同步。因此,您创建的每个 Thread 都将锁定不同的对象。因此,您应该传递一个公共(public)对象来获取锁,如下所示。

class MyThread extends Thread {

private static int runCount = 0;

Object lock;

public MyThread(Object lock) {
this.lock = lock;
}

public void printThread() {
synchronized (lock) {
// your code here
}

}

//.........
}

然后这样调用它:

Object lock = new Object();
for (int i = 0; i < threadMax; i++) {
new MyThread(lock).start();
}

但是,上面的程序并不能保证它会按顺序运行。有几种方法可以做到这一点。您可以使用 wait() 和 notify() 来实现您的目标。引用下面的例子:

public void printThread() {

while (runCount < 90) {
synchronized (lock) {
while (runCount % 10 != remainder) {

try {
lock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

System.out.println(runCount + ": " + Thread.currentThread().getName());
runCount++;
lock.notifyAll();
}
}

}

然后像这样调用线程:

    Object lock = new Object();
for (int i = 0; i < 10; i++) {
new MyThread(lock, i).start();
}

关于java - 如何让我的线程按顺序运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55704195/

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