gpt4 book ai didi

java - 如何从线程 1 等待直到线程 2 通知

转载 作者:搜寻专家 更新时间:2023-10-31 20:22:01 25 4
gpt4 key购买 nike

我是多线程的新手,当我阅读有关多线程的内容时,想到编写这段奇特的多线程代码来执行以下操作。

我的计数器类如下。

class Counter {
private int c = 0;

public void increment() {
System.out.println("increment value: "+c);
c++;
}

public void decrement() {
c--;
System.out.println("decrement value: "+c);
}

public int value() {
return c;
}

}

这个 Counter 对象在两个线程之间共享。线程启动后,我需要执行以下操作。我希望 Thread2 等到 Thread1 将 Counter 对象的计数递增 1。完成后,线程 1 通知线程 2,然后线程 1 开始等待线程 2 将值减 1。然后 thread2 启动并将 value 减 1 并再次通知 thread1 然后 thread2 开始等待 thread1。重复这个过程几次。

我怎样才能做到这一点。非常感谢。

我做了以下事情。

public class ConcurrencyExample {

private static Counter counter;
private static DecrementCount t1;
private static IncrementCount t2;

public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(new IncrementCount(counter));
t1.start();

Thread t2 = new Thread(new DecrementCount(counter));
t2.start();

}

}


public class DecrementCount implements Runnable {

private static Counter counter;

public DecrementCount(Counter counter) {
this.counter = counter;
}

@Override
public void run() {
for (int i = 0; i < 1000; i++) {
counter.decrement();
System.out.println("decreamented");
}
}

}


public class IncrementCount implements Runnable {

private static Counter counter;

public IncrementCount(Counter counter) {
this.counter = counter;
}

@Override
public void run() {
for (int i = 0; i < 1000; i++) {
counter.increment();
System.out.println("Incremented");
}

}

}

最佳答案

查看 Semaphore .您将需要两个,每个线程一个:incSemaphoredecSemaphore。在 DecrementCount 中做:

for (int i = 0; i < 1000; i++) {
decSemaphore.acquire();
counter.decrement();
System.out.println("decreamented");
incSemaphore.release();
}

对称地实现IncrementCountincSemaphore 的初始值应该是1decSemaphore 的初始值应该是0

顺便说一句,您的Counter 也需要同步(请参阅synchronized 关键字和AtomicInteger)。

关于java - 如何从线程 1 等待直到线程 2 通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12586897/

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