2 回答

TA贡献1828条经验 获得超13个赞
尽管该任务不需要线程,但这里有一种使用java 8 CompletableFuture在描述中编写代码的不同方法。
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
for (int i = 0; i < 2; i++) {
System.out.println("A" + (i + 1));
}
}).thenRunAsync(() -> {
System.out.println("B1");
}).thenRunAsync(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("C" + (i + 1));
}
});

TA贡献1757条经验 获得超7个赞
正如第一条评论所说,您的任何对象之间都没有进行任何同步。也许通过更改启动线程的顺序(首先 C,然后是 B,然后是 A),这可能会变得很明显。
要使线程之间的调度正常工作,您需要:
找到一个对两个线程都可见的对象,以便两个线程都可以在该对象上等待()和 notify()。
建立将导致等待停止的条件,并在一段时间内将其放入()
所以你得到一些:
while (countA < 2) AClass.class.wait();
在 B 线程中(并在循环中捕获中断异常,不要传播)
并在您放置的 A 线程中
AClass.class.notify();
在打印循环退出后。
您可以(在工业环境中,大多数情况下应该)将AClass.class替换为专用于该目的的同步对象(并且已对两个线程都可见)。
while() 是必要的,因为所谓的“虚假唤醒”:如果 notify() 导致它退出,则 wait() 将退出,但它也可以在没有发出此类 notify() 的情况下退出。
最后,请注意,while() 循环中的条件从线程 B 访问 countA 字段,而线程 A 可能正在更新它。对于简单整数,这可能仍然是万无故障的,但对于更复杂的评估,这本身就是争用条件错误的潜在来源,因此需要依次同步这些访问。另请注意,如果线程A由于任何原因崩溃,则可能永远不会成为真,因此这不是设置内容的最可靠方法,因为它会导致系统挂起。while(countA<2)
如果所有这些都更像是胡言乱语而不是英语,你应该首先尝试找到一个关于线程的体面教程,并仔细研究。
添加回答
举报