昨天我问了关于线程同步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 loop和\n之前,在for loop之后,但是它被混合在其他消息中,因为主线程也是线程。
我怎么才能修好它?
+一些重要信息
我不能使用join或completablefuture。我必须使用notify()或wait()
我的预期结果低于。
打印一条消息“开始” 主程序执行 打印消息“结束” 打印一条消息“开始” 主程序执行 打印消息“结束” 打印一条消息“开始” 主程序执行 打印消息“结束”
这种情况持续了5次。“主程序”是指~sensor对象的6个线程。
Sensor +类请求
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();
}发布于 2018-05-06 07:35:47
除非我正在编写并发构建块,否则我可能不会在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();发布于 2018-05-06 07:15:29
您需要在CarSensoer代码中添加打印
发布于 2018-05-06 07:26:44
如果线程构造函数中的每个参数都是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());
}
}https://stackoverflow.com/questions/50197143
复制相似问题