我有一个spring-mvc应用程序,该应用程序具有执行不同功能的许多不同线程。 如果可以使程序(和日志)更具确定性,我将非常高兴。 (所有内容总是以相同的顺序执行)。
也许有一种简单的方法。
或者至少,您有一个建议如何调试这种多线程应用程序?
答案 0 :(得分:3)
对于日志记录,您可以包括线程ID,然后进行过滤以一次仅查看一个线程。
线程上下文切换取决于OS调度程序,此外,它还取决于其他正在运行的进程。确保线程以特定顺序运行的唯一方法是使用并发信令机制,除非您有充分的理由,否则不应该这样做。您应用的重要结果应该是确定性的(否则,这是竞争条件)。但是交织线程的执行顺序应该有所不同。
答案 1 :(得分:1)
Dane的想法很有趣,但我建议不要将其作为调试多线程代码的一种方式。
为什么?
因为日志记录可能会更改您要调试的代码的属性。
使用常规调试器也是如此。
实际上,没有一种调试多线程代码的简便方法。
我的建议是:
尝试使用Java SE库中的高级并发构造来实现代码。
要特别注意确保由多个线程共享的对象和数据结构正确同步。
遇到问题时,尝试通过推理来解决问题。
尝试找到可以提供帮助的静态代码分析器。
答案 2 :(得分:0)
您可以在java.util.concurrent包中使用ExecutorService。这是在多线程应用程序中处理线程的简便得多的方法。
如果只想运行一个线程。 Executors.newSingleThreadExecutor();
您可以从此处参考示例 https://www.tutorialspoint.com/java_concurrency/concurrency_newsinglethreadexecutor.htm
稍后,如果要使用多个线程运行同一程序。采用 ExecutorService执行程序= 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