线程,代码和数据–多线程Java程序实际运行的方式
有些事情是您在學術或培訓班上沒有學到的,經過幾年的工作經驗后才逐漸了解,然后才意識到,這是非常基本的事情,我為什么錯過了這么多年。 了解多線程Java程序的執行方式就是其中之一。 您肯定已經聽說過線程,如何啟動線程,如何停止線程,諸如其獨立的執行路徑之類的定義,處理線程間通信的所有時髦庫,但是在調試多線程Java程序時,您會斗爭。
至少我可以從我的親身經歷中說出來。 在我看來,調試是真正的培訓師,您將學到一個精妙的概念,并形成只有通過調試才能持續很長時間的理解。
在本文中,我將討論有關任何程序執行的三個重要事項,而不僅僅是Java,線程,代碼和數據。
一旦您對這三個函數如何協同工作有了很好的了解,您將更容易理解程序的執行方式,為什么某個錯誤僅在某些時候出現,為什么某個特定的錯誤會一直出現以及為什么某個特定的錯誤確實存在?隨機。
線程,代碼和數據如何協同工作
什么是程序? 簡而言之,這是一段代碼,將其翻譯為CPU的二進制指令。 CPU是執行那些指令的人,例如從內存中獲取數據,添加數據,減去數據等。總之,您編寫的是您的程序,即代碼。
在同一程序的不同執行之間,數據是不同的。 這不僅意味著重啟程序,還意味著一個處理周期,例如,對于一個電子交易應用程序,處理一個訂單就是一次執行。 您可以在一分鐘內處理成千上萬的訂單,并且每次迭代都會改變數據。
還有一點要注意的是,您可以在代碼中創建線程,然后將它們并行運行并執行代碼,這些代碼是在它們的run()方法內部編寫的。 要記住的關鍵是線程可以并行運行。
當Java程序啟動時,將創建一個稱為主線程的線程,該線程執行在main方法內部編寫的代碼,如果創建線程,則這些線程由主線程創建并啟動,一旦啟動,它們便開始執行編寫的代碼其
run()方法。
因此,如果您有10個線程來處理訂單,它們將并行運行。 簡而言之,線程執行代碼,并傳入數據。現在,我們將討論三種不同類型的問題
1)問題,總是會出現
2)問題,僅在某些時候出現,但與相同的輸入內容一致
3)問題,這確實是隨機的
問題一最有可能是由于錯誤的代碼而引起的,也稱為編程錯誤,例如訪問程序的無效索引。
array ,在將其設置為null或什至在初始化之前訪問Object的方法。 如您所知,它們很容易修復。
您只需要了解編程語言和API即可解決此錯誤。
第二個問題是數據而不是代碼。 只是有時但總是帶有相同的輸入,可能是由于邊界處理不正確,數據格式錯誤(例如訂單)而沒有某些字段(例如價格,數量等)。
您的程序應始終以健壯的方式編寫,這樣,如果輸入的數據不正確,程序就不會崩潰。 影響只應與該訂單有關,其余訂單必須正確執行。
第三個問題很可能是由于多線程引起的,多線程執行的順序和交織會導致競爭條件或死鎖 。 它們是隨機的,因為它們僅在某些隨機事件發生時才會出現,例如,線程2在線程1之前獲得CPU,從而鎖定了錯誤的順序。
請記住,線程調度程序和操作系統負責將CPU分配給線程,它們可以暫停它們,隨時從它們中獲取CPU,所有這些都可以創建一個獨特的方案,從而暴露了多線程和同步問題。
您的代碼從不依賴于線程等的順序,它必須健壯才能在所有條件下完美運行。
簡而言之,請記住線程使用給出的數據作為輸入執行代碼。 每個線程使用相同的代碼,但使用不同的數據。 在調試問題時,請注意線程,代碼和數據這三者。
感謝您到目前為止閱讀本文。 如果您喜歡這篇文章,請與您的朋友和同事分享。 如果您有任何疑問或反饋,請留言。
翻譯自: https://www.javacodegeeks.com/2019/03/multithreading-java-program-actually-run.html
總結
以上是生活随笔為你收集整理的线程,代码和数据–多线程Java程序实际运行的方式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器日志记录_5种改善服务器日志记录的
- 下一篇: (linux if -gt)