java - 确保两个线程在一个循环中一个接一个 - Android
问题描述
我有两个这样开始的线程
Thread player1Thread = new Thread(new Player1RunnableManual());
player1Thread.start();
Thread player2Thread = new Thread(new Player2RunnableManual());
player2Thread.start();
两位玩家,玩家 1 和玩家 2 以不同的方式猜测 100 个数字,一次一个。我们可以忽略他们用来猜测数字的启发式方法。我需要确保 player1 先运行,然后 player2 运行,然后 player1 运行,然后 player2 再次运行,直到其中一个猜到特定数字(硬编码)。
我尝试使用可重入锁,但无法使其工作。player1 和 player2 的可运行文件如下。
如何编写锁实现以使其工作?
class Player1RunnableManual implements Runnable {
@Override
public void run() {
while (!gopherFound) {
r = new Random();
final int player1Position = r.nextInt(high - low) + low;
final int outcome = calculateProximity(player1, player1Position);
if (outcome != DISASTER) {
runnableHandler.post(new Runnable() {
@Override
public void run() {
if (holes[player1Position] == 0) {
setPosition(player1, player1Position);
player1Status.setText(outcomesList[outcome]);
}
}
});
if (outcome == SUCCESS) {
gopherFound = true;
winner = "Player 1";
result.setText("Player 1 wins");
break;
}
}
try {
int sleep = r.nextInt(threadHigh - threadLow) + threadLow;
Thread.sleep(sleep);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}
class Player2RunnableManual implements Runnable {
@Override
public void run() {
for (int i = 1; i <= 100 && !gopherFound; i++) {
final int player2Position = i;
final int outcome = calculateProximity(player2, player2Position);
if (outcome != DISASTER) {
Message msg = messageHandler.obtainMessage(player2);
msg.arg1 = player2Position;
msg.arg2 = outcome;
messageHandler.sendMessage(msg);
if (outcome == SUCCESS) {
gopherFound = true;
winner = "Player 2";
result.setText("Player 2 wins");
break;
}
}
try {
int sleep = r.nextInt(threadHigh - threadLow) + threadLow;
Thread.sleep(sleep);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
}
}
解决方案
以确保一个动作会一个接一个地触发。您可以简单地使用ThreadPoolExecutor
. 像下一个。
final ThreadPoolExecutor executor =
(ThreadPoolExecutor) Executors.newFixedThreadPool(1);
executor.submit(new Runnable() {
@Override
public void run() {
// Your action 1
}
});
executor.submit(new Runnable() {
@Override
public void run() {
// Your action 2
}
})
推荐阅读
- intellij-idea - 未使用的属性 WebStorm
- node.js - 更新查询在 node-oracledb 模块中挂起
- node.js - 在多个 kubernetes pod/实例中处理 Redis KUE 作业
- css - 无法更改引导按钮
- reactjs - 徽章组件的自定义颜色不起作用
- vmware - Packer vmware-iso builder 因“意外的 EOF”而失败
- angular - 由于类型冲突,将用户输入推送到 Typescript 数组的问题
- javascript - 对象不支持“延迟”属性或方法
- .net - Winforms:防止自动绘制子控件
- reactjs - 错误:当目标不是服务器时无法导出。在部署期间使用下一个 js 和 zeit-NOW