java利己線程

所謂利己線程,就是在運行時不考慮其它線程的運行權限和時間分配,一心只顧自己運行完成了事的這種線程,比如:while(true){............}
但是,如果{..........}的代碼中要調用一些資源,就一定要sleep,讓資源有空閒的時間來讓本線程獲取,也許這些資源不是當前線程一方要求調用,但無論如何要空閒一定的時間,即使資源空閒下來時本線程只能調用很少一部份,不然真的就死鎖了.
 
在圖形編程中,加載一個圖形是異步的,然後組件會調用觀察類ImageObserver來不斷讓圖形加載和顯示進行更新直到完成.因爲圖形組件的頂級對象 Component 已經實現ImageObserver,所以一般來說如果要加載一個Image,只要在drawImage方法中調用this(自己)作爲觀察者就行.
 
但是,如果我們要把一個源圖象縮放後輸出,或把多個源圖象合併成一個圖象輸出(圖形計數器就是把很多種0-9的數字圖片合併成一個圖片)輸出,那就是在內存中先生生成一個BufferedImage對象,然後把源圖象draw到BufferedImage的一定位置,再把BufferedImage編碼輸出到一個輸出流如文件或網頁.因爲drawImage是BufferedImage的Graphics對象調用的,一切都在內存中而根本沒有可視組件,所以根本沒有觀察者對象,而MediaTracker對象同樣要求一個組件對象構造,在這種時候也沒法調用.
 
 
BufferedImage bi = new BufferedImage(目標寬,目標高,BufferedImage.TYPE_INT_RGB);
Graphics2D g =(Graphics2D)image.getGraphics();
Image src = Toolkit.getDefaultToolkit().getImage("d:/aaa.jpg");
不管你的src原來是多大,只要你draw時設定大小,就會以你設定的大小畫到目標bi上,這就是
縮略圖或合成圖的方法.但在g.drawImage(src,座標x,座標y,寬,高,觀察者);調用時,因爲沒有一個觀察者實例,一次調用99%不會成功.所以我是這樣調用的:
while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) ;
大家注意是如果flag爲flase就只有一個";"也就是什麼也不做直接進入下一次循環.
我試過一般畫一張新圖要10多秒,如果是生成計數器,這在servlet中根本不行.沒有人願意用10秒的時間等一個計數器出來.後來我想讓這個servlet實現觀察者.就在
while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
 
}
中調試它每次getWidth(null)的log並打印出來,結果發現如果改成
    while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
    System.out.println(src.getWidth(null));
}
卻只要200MS,0.2秒左右就完成了.原來,System.out時要調用BIOS的資源,這時線程要閒置等待,到反而讓src資源有了load的時間.於是改成:
    while (!(flag=g.drawImage(src, 0, 0, 240, 320, null))) {
    Thread.currentThread().sleep(1);
}
哈哈,成功了.sleep時1,5,10MS沒有多大區別,都在200MS左右完成,一般不要再睡更多的時間.
 
所以即使是利己線程的也要看它是否對其它資源的請求,真的應了那句話叫"予人方便,於己方便!"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章