gpt4 book ai didi

java - 如何在线程迭代之前和之后打印一些消息?

转载 作者:行者123 更新时间:2023-12-02 11:17:03 25 4
gpt4 key购买 nike

我昨天问了线程同步的问题in this post .

终于解决了同步问题,但我必须在线程迭代之前/之后打印。

代码如下,只是迭代。

for(int i=0; i<5; i++) {
CarSensors=
new Thread[]{
new Thread(frontCarSensor),
new Thread(leftRightCarSensor),
new Thread(LaneSensor),
new Thread(SignalSensor),
new Thread(PedestrianSensor),
new Thread(ObjectSensor)
};

for(Thread t:CarSensors) t.start();
}

我尝试在for循环之前打印消息“汽车传感器检查...”,在for循环之后打印\n,但它是混合的在其他消息中,因为主线程也是线程。

如何修复它?

<小时/>

+一些重要信息

我无法使用joincompletablefuture。我必须使用 notify()wait()

我的结果预期如下。

print a message "start"
main program execution
print a message "end"

print a message "start"
main program execution
print a message "end"

print a message "start"
main program execution
print a message "end"

持续5次。“主程序”是指 ~sensor 对象的 6 个线程。

+请求传感器

public abstract class Sensor implements Runnable {
protected Random random;
protected HashMap<String,String> message;
protected final static Object lock=new Object();
protected String[] event;

protected Sensor(){
random=new Random();
message=new HashMap<String,String>();
}

public abstract void Direction();
}

最佳答案

我可能不会直接在Java中使用Thread,除非我正在编写并发构建 block 。此外,与您可以通过编程执行的大多数其他操作相比,线程非常昂贵,因此如果可能,应避免动态线程创建(尤其是在循环中)。

在本案例中,解决方案可能是使用 CompletableFutureExecutors 框架的功能(下面的基本示例)。

CompletableFuture 允许注册完成钩子(Hook),因此任何类型的遥测都可以围绕主逻辑进行,而无需触及后者。

防止消息重叠委托(delegate)打印到单个线程执行器,并按时间戳、汽车 ID 或其他任何适当的内容对它们进行排序。

import static java.util.concurrent.CompletableFuture.runAsync;


// You can use JDK Executors, Guava Executors,
// or write your own taking the concurrency consideration
// away from the business logic
final Executor executor = Executors.newFixedThreadPool(N);

CompletableFuture collector = CompletableFuture.completed((Void)null);
for (int i = 0; i < 5; ++i) {
collector = CompletableFuture.allOf(
collector,
runAsync(frontCarSensor, executor),
runAsync(leftRightCarSensor, executor),
runAsync(LaneSensor, executor),
runAsync(SignalSensor, executor),
runAsync(PedestrianSensor, executor),
runAsync(ObjectSensor, executor)).join();
}
collector.join();

关于java - 如何在线程迭代之前和之后打印一些消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50197143/

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