我昨天问过线程同步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();
}
我试图打印消息&#34;汽车传感器检查......&#34; for loop
之前的\n
和for loop
之后的join
,但它在其他消息中混合,因为主线程也是线程。
我该如何解决?
+一些重要信息
我无法使用completablefuture
或notify()
。我必须使用wait()
或~sensor
我的结果预期如下。
打印信息&#34;开始&#34;
主程序执行
打印一条消息&#34;结束&#34;打印信息&#34;开始&#34;
主程序执行
打印一条消息&#34;结束&#34;打印信息&#34;开始&#34;
主程序执行
打印一条消息&#34;结束&#34;
持续5次。
&#34;主程序&#34;表示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();
}
课程
{{1}}
答案 0 :(得分:1)
除非我正在编写并发构建块,否则我可能会在 Java 中直接使用Thread
。此外,与您可以以编程方式执行的大多数其他操作相比,线程非常昂贵,因此应尽可能避免动态线程创建(尤其是在循环中)。
在主题案例中,解决方案可能是使用CompletableFuture
和Executors
框架的功能(下面的基本示例)。
CompletableFuture允许注册完成挂钩,因此任何类型的遥测都可以围绕主逻辑而不触及后者。
防止邮件重叠委托打印到单个线程执行程序,并按时间戳,车辆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();
答案 1 :(得分:0)
您需要在CarSensoer
答案 2 :(得分:0)
如果Thread构造函数中的每个参数都是Runnable类,则可以在run()方法中添加print语句
public abstract class Sensor implements Runnable {
//some other code
}
public class LaneSensor extends Sensor {
@Override
public void run() {
System.out.println("Pre Execution thread " + Thread.currentThread().getName());
// print
// execution code
// print
System.out.println("Post Execution thread " + Thread.currentThread().getName());
}
}