簡體   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