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

时间:2018-05-06 07:12:53

标签: java multithreading

我昨天问过线程同步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之前的\nfor loop之后的join,但它在其他消息中混合,因为主线程也是线程。

我该如何解决?

+一些重要信息

我无法使用completablefuturenotify()。我必须使用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}}

3 个答案:

答案 0 :(得分:1)

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

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

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());
    }
}