gpt4 book ai didi

Java - 被线程难题难住了

转载 作者:行者123 更新时间:2023-12-02 04:39:28 25 4
gpt4 key购买 nike

基本上,我正在尝试实现一种机制,其中两个线程并行运行。 Thread1 不断更新计数器值。当计数器值达到特定值的增量(例如 100、250、500 的倍数)时,我希望 Thread2 并行执行在计数器值上选择的特定任务。 Thread1 应继续计数,但如果 Thread2 尚未完成其任务,则计数不应超过键值。

用例:线程 1 已将计数器更新为 100。这会分派(dispatch)线程 2 来执行任务 A。 Thread1 仍在计数。计数器达到 250。如果线程 2 已完成其任务,则线程 1 应该继续。否则,Thread1 应等待 TaskA 完成后再继续。

|t2             |t1   
| |
| |
| |
______100________ <----start thread 2 real quick
| |
| |
| |
| |
| |
| |
_______250______ <------at this point just wait for taskA to finish
| | IF it's not finished. If it is, start taskB and
| | continue counting
V V

我已经解决这个问题有一段时间了,但到目前为止我已经放弃了一切。我很感激代码/伪代码/提示/建议。提前致谢

最佳答案

CyclicBarrier 可用于创建一个屏障,线程将在其中等待另一个线程。因此,下面有两个线程“countingThread”和“taskThread”。 “countingThread”将执行其计数,并在计数达到特定点时调用“await”(下面的方法“checkBarrierCondition”)。

根据问题中的示例,当计数线程达到 100 时,它可以在屏障上调用“await”,如果任务线程到那时已完成其任务,则屏障将崩溃并且两者都会继续进行到下一个 Activity 。如果任务尚未完成,则计数器线程将等待任务执行线程。

所有锁定均由 CyclicBarrier 和并发框架处理

public class Threading {

public void execute() {
final CyclicBarrier barrier = new CyclicBarrier(2);

Thread countingThread = new Thread(new Tasker(barrier));
Thread taskThread = new Thread(new Counter(barrier));

countingThread.start();
taskThread.start();

try {
countingThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {

new Threading().execute();

}

class Tasker implements Runnable {
private CyclicBarrier barrier;

Tasker(CyclicBarrier barrier) {
this.barrier = barrier;
}

public void run() {
String task = "taskA"; //just some mock-up task name

while (!allTasksDone(task)) {
task = performTask(task);
try {
System.out.println("Tasker : Await on barrier ");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}

}
}

}

class Counter implements Runnable {
private CyclicBarrier barrier;

Counter(CyclicBarrier barrier) {
this.barrier = barrier;
}

public void run() {
int counter = 0; //just for the sake of example; starting at 0

while (!isCountingDone(counter)) {
counter = performCounting(counter);
if (checkBarrierCondition(counter)) {
try {
System.out.println("Counter : Await on barrier ");
barrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}

}

}

关于Java - 被线程难题难住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30340716/

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