熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java高級技術 >> 正文

Java線程模型如何完善相關的數據處理

2013-11-23 19:52:34  來源: Java高級技術 

  Java線程模型在使用耳朵時候需要大家不斷的進行學習下面我們就看看如何才能更好的掌握相關的技術語言判斷是搶占式還是協作式的Java線程模型取決於虛擬機的實現者並根據各種實現而不同因此Java開發員必須編寫那些能夠在兩種模型上工作的程序

  正如前面所提到的在搶占式模型中線程可以在代碼的任何一個部分的中間被打斷除非那是一個原子操作代碼塊原子操作代碼塊中的代碼段一旦開始執行就要在該線程被換出處理器之前執行完畢在 Java 編程中分配一個小於位的變量空間是一種原子操作而此外象double和long這兩個位數據類型的分配就不是原子的使用鎖來正確同步共享資源的訪問就足以保證一個多線程程序在搶占式模型下正確工作

  而在協作式模型中是否能保證線程正常放棄處理器不掠奪其他線程的執行時間則完全取決於程序員調用yield()方法能夠將當前的線程從處理器中移出到准備就緒隊列中另一個方法則是調用sleep() 方法使Java線程模型放棄處理器並且在 sleep 方法中指定的時間間隔內睡眠

  正如你所想的那樣將這些方法隨意放在代碼的某個地方並不能夠保證正常工作如果線程正擁有一個鎖(因為它在一個同步方法或代碼塊中)則當它調用yield()時不能夠釋放這個鎖這就意味著即使這個Java線程模型已經被掛起等待這個鎖釋放的其他線程依然不能繼續運行為了緩解這個問題最好不在同步方法中調用yield方法將那些需要同步的代碼包在一個同步塊中裡面不含有非同步的方法並且在這些同步代碼塊之外才調用yield

  另外一個解決方法則是調用wait()方法使處理器放棄它當前擁有的對象的鎖如果對象在方法級別上使同步的這種方法能夠很好的工作因為它僅僅使用了一個鎖如果它使用finegrained鎖則wait() 將無法放棄這些鎖此外一個因為調用wait()方法而阻塞的線程只有當其他線程調用notifyAll()時才會被喚醒

  Java線程模型模型和AWT/Swing

  在那些使用Swing 和/或AWT包創建GUI(用戶圖形界面)的Java程序中AWT事件句柄在它自己的線程中運行開發員必須注意避免將這些GUI線程與較耗時間的計算工作綁在一起因為這些線程必須負責處理用戶時間並重繪用戶圖形界面換句話來說一旦GUI線程處於繁忙整個程序看起來就象無響應狀態Swing線程通過調用合適方法通知那些Swing callback(例如 Mouse Listener 和 Action Listener )這種方法意味著listener無論要做多少事情都應當利用listener callback方法產生其他線程來完成此項工作目的便在於讓listener callback更快速返回從而允許Swing線程響應其他事件

  如果一個Swing線程不能夠同步運行響應事件並重繪輸出那怎麼能夠讓其他的線程安全地修改 Swing的狀態?正如上面提到的Swing callback在Swing 線程中運行因此他們能修改Swing數據並繪到屏幕上

  但是如果不是Swing callback產生的變化該怎麼辦呢?使用一個非Swing線程來修改Swing數據是不安全的Swing提供了兩個方法來解決這個問題invokeLater()和invokeAndWait()為了修改Swing狀態只要簡單地調用其中一個方法讓Runnable的對象來做這些工作因為Runnable對象通常就是它們自身的線程你可能會認為這些對象會作為線程來執行但那樣做其實也是不安全的事實上Swing會將這些對象放到隊列中並在將來某個時刻執行它的run方法這樣才能夠安全修改Swing狀態

  Java 語言的設計使得多線程對幾乎所有的Applet都是必要的特別是IO和GUI編程都需要多線程來為用戶提供完美的體驗如果依照本文所提到的若干基本規則並在開始編程前仔細設計系統——包括它對共享資源的訪問等你就可以避免許多常見和難以發覺的Java線程模型陷阱


From:http://tw.wingwit.com/Article/program/Java/gj/201311/27597.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.