繁体   English   中英

Java的。 有没有一种简单的方法可以对多线程应用程序进行序列化,从而使调试更加容易?

[英]Java. Is there an easy way to sequentialize a multithreaded app to make debugging easier?

我有一个spring-mvc应用程序,该应用程序具有执行不同功能的许多不同线程。 如果可以使程序(和日志)更具确定性,我将非常高兴。 (所有内容始终以相同的顺序执行)。

也许有一种简单的方法可以做到这一点。

或者至少,您有一个建议如何调试这种多线程应用程序???

对于日志记录,您可以包括线程ID,然后进行筛选以一次仅查看一个线程。

线程上下文切换取决于OS调度程序,此外,它还取决于其他正在运行的进程。 确保线程以特定顺序运行的唯一方法是使用并发信令机制,除非您有充分的理由,否则不应该这样做。 您应用的重要结果应该是确定性的(否则,这是竞争条件)。 但是交织线程执行的顺序应该有所不同。

Dane的想法很有趣,但是我建议不要将其作为调试多线程代码的一种方式。

为什么?

因为日志记录可能会更改您尝试调试的代码的属性。

使用常规调试器也是如此。

实际上,没有一种调试多线程代码的简便方法。

我的建议是:

  1. 尝试使用Java SE库中的高级并发构造来实现代码。

  2. 请特别注意确保正确同步多个线程共享的对象和数据结构。

  3. 当您遇到问题时,请尝试通过对问题进行推理来找出正在发生的情况。

  4. 尝试找到可以提供帮助的静态代码分析器。

您可以在java.util.concurrent包中使用ExecutorService。 这是在多线程应用程序中处理线程的简便得多的方法。

如果只想运行一个线程。 Executors.newSingleThreadExecutor();

您可以从这里参考示例https://www.tutorialspoint.com/java_concurrency/concurrency_newsinglethreadexecutor.htm

以后,如果要使用多个线程运行同一程序。 使用ExecutorService executor = Executors.newFixedThreadPool(int nThreads); 它创建一个线程池,该线程池重用在共享的无边界队列上运行的固定数量的线程。

例如: https//www.tutorialspoint.com/java_concurrency/concurrency_newfixedthreadpool.htm

有关更多说明,请参阅此。 https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM