gpt4 book ai didi

java - While 循环期间的线程等待

转载 作者:行者123 更新时间:2023-12-01 06:25:24 25 4
gpt4 key购买 nike

我的应用程序有 1 个全局驱动程序,负责执行低级工作。然后我有两个线程,两个线程都使用无限循环来完成一些工作。我的问题是如何允许 1 个线程尽可能多地使用驱动程序,但在必要时给第二个线程使用它的机会。

详细来说,我的代码如下:

public class Game {
private static final Object LOCK = new Object();
private static final Logger LOGGER = Logger.getLogger(Game.class);

private WebDriverController controller;

public Game(WebDriverController controler) {
this.controller = controller;
}

public void startThreadA() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (LOCK) {
controller.doSomethingA();
}
}
}
}).start();
}

public void startThreadB() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
...
...
synchronized (LOCK) {
controller.doSomethingB();
}
...
...
}
}
}).start();
}
}

其逻辑是允许第一个线程尽可能多地执行 doSomethingA(),而第二个线程仅获取锁来完成一些小任务,然后将锁返回给第一个线程.

使用此代码,第一个线程将连续使用 Controller 来执行其需要执行的操作,而第二个线程则陷入等待其同步块(synchronized block)的状态。我当前解决此问题的方法是向第一个线程添加暂停,以使第二个线程有机会获取锁,如下所示:

public void startThreadA() {
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
synchronized (LOCK) {
controller.doSomethingA();
}
try {
Thread.sleep(1);
} catch (InterruptedException e) {
LOGGER.error(null, e);
}
}
}
}).start();
}

这确实按照预期工作,但似乎不太正确。我对每次迭代后的手动暂停不满意,特别是如果第二个线程不需要锁,因为它浪费时间。

我应该用什么来代替暂停来提高效率?

最佳答案

为什么在run()中使用synchronized?在 WebDriverController 的方法中使用 synchronizedLock

public void doSomeThingA(){
lock.lock();
try {
//your stuff
} finally {
lock.unlock();
}
}

并在Thread的run方法中调用这些方法。

关于java - While 循环期间的线程等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27657463/

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