首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在线程迭代前后打印一些消息?

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

Stack Overflow用户
提问于 2018-05-06 07:12:52
回答 3查看 464关注 0票数 0

昨天我问了关于线程同步in this post的问题。

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

代码在下面,它只是迭代。

代码语言:javascript
运行
复制
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之后,但是它被混合在其他消息中,因为主线程也是线程。

我怎么才能修好它?

+一些重要信息

我不能使用joincompletablefuture。我必须使用notify()wait()

我的预期结果低于。

打印一条消息“开始” 主程序执行 打印消息“结束” 打印一条消息“开始” 主程序执行 打印消息“结束” 打印一条消息“开始” 主程序执行 打印消息“结束”

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

Sensor +类请求

代码语言:javascript
运行
复制
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();
}
EN

回答 3

Stack Overflow用户

发布于 2018-05-06 07:35:47

除非我正在编写并发构建块,否则我可能不会在Java中直接使用Thread。此外,与大多数您可以编程完成的事情相比,线程非常昂贵,因此在可能的情况下,应该避免动态线程创建(特别是循环中的线程)。

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

CompletableFuture允许注册完成钩子,因此任何类型的遥测都可以封装在主逻辑周围,而无需接触后者。

以防止将消息重叠委托打印到单个线程执行器,并按时间戳、汽车ID或其他适当的方法对它们进行排序。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-05-06 07:15:29

您需要在CarSensoer代码中添加打印

票数 0
EN

Stack Overflow用户

发布于 2018-05-06 07:26:44

如果线程构造函数中的每个参数都是Runnable类,则可以在run()方法中添加print语句

代码语言:javascript
运行
复制
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());
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50197143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档