java - 如何交替运行 2 个线程
问题描述
我是线程新手,我正在尝试使输出看起来像:aAbBcCdDeE...。我搜索并尝试了很多东西,但没有真正使它起作用。在练习中,您应该使用全局布尔变量来执行此操作,但我并没有真正找到任何有用的东西并且有点迷失了。感谢您的帮助!
public class ABCThread implements Runnable {
char c;
public ABCThread(char c) {
this.c = c;
}
@Override
public synchronized void run() {
for (char i = 0; i < 26; i++) {
System.out.println(c++);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new ABCThread('a'));
Thread t2 = new Thread(new ABCThread('A'));
t1.start();
t2.start();
}
}
输出:
a
A
B
b
C
c
d
D
e
E
f
F
G
g
H
h
I
i
J
j
解决方案
快速回答:
您不能强制线程在某个时刻运行。不过,您可以做的是让这两个运行“不同步”(与异步编码无关)。
Thread t1 = new Thread(new ABCThread('a'));
Thread.sleep(250);
Thread t2 = new Thread(new ABCThread('A'));
第一个线程大约每 500 毫秒打印一次,第二个线程将在 250、750、1250 等处打印。请注意,这不是在实际程序中解决此问题的正确方法。但是话又说回来,您也可能不会添加Thread.sleep(500)
到 run 方法。
更好的:
您需要线程之间的同步。因为您启动了两个线程,所以您可以使用布尔值。
public class ABCThread implements Runnable {
char c;
static boolean synchronizer = false;
boolean runOn;
public ABCThread(char c, boolean runOn) {
this.c = c;
this.runOn = runOn;
}
@Override
public synchronized void run() {
int count = 0;
while(count < 26)
{
if(runOn != synchronizer)
{
Thread.sleep(100);
continue;
}
count++;
synchronizer = !synchronizer;
System.out.println(c++);
}
}
Thread t1 = new Thread(new ABCThread('a', false));
Thread t2 = new Thread(new ABCThread('A', true));
只是把这个打出来。它可能无法编译。
Thread.sleep(100)
只是一些数字。它可能会更低,但对于这个问题并不重要。
更好 之前的代码可以只用 2 个线程运行!1 只会停留在 synchronizer = false 上。如果添加第三个,那么同步器将无法工作,因为它只有 2 个状态。您可以添加一个整数而不是布尔值和另一个整数 amountOfThreads。需要将 amountOfThreads 设置为您将启动的线程数。然后在线程打印时增加原子整数,如果同步器(原子 int)大于 amountOfThreads,则将其设置为 0。
推荐阅读
- python - 如何从 JSON 响应 RobotFramework 获取所需参数
- python - Plotly:如何从两个数据框列绘制两条线并从其他两列分配悬停信息?
- swift - Xcode 中的“首选大标题”是否存在错误?
- c - 无法弄清楚 C 语言中的 scanf("%[^\n]\n", input) 会发生什么
- javascript - Javascript - 构造一个数组,其中的元素从字符串中重复
- json - 从服务器获取 Flutter 和 JSON 的问题
- postgresql - Postgres - 按特定条件排序
- javascript - 如何在 javascript 或 typescript 中将时间戳转换为人类日期
- angular - 带有路径的表单控件没有值访问器:'funder_details -> 0。生成动态表单数组时出现此错误
- node.js - $add,$subtract MongoDB 中的聚合框架