正常的情況下,執行緒在執行時多個執行緒之間執行任務的時機是無序的。可以通過改造**的方式使它們執行具有有序性。
public class mythread extends thread
@override
public void run()
} else }}
} catch (interruptedexception e)
}}public class run
}
threadname=thread-0,runcount=1 aa
threadname=thread-1,runcount=2 bb
threadname=thread-2,runcount=3 cc
threadname=thread-0,runcount=4 aa
threadname=thread-1,runcount=5 bb
threadname=thread-2,runcount=6 cc
threadname=thread-0,runcount=7 aa
threadname=thread-1,runcount=8 bb
threadname=thread-2,runcount=9 cc
類******datefonnat主要負責日期的轉換與格式化,但在多執行緒的環境中,使用此類容易造成資料轉換及處理的不準確,因為******dateformat類並不是執行緒安全的。
1、出現異常
本示例將實現使用類******dateformat在多執行緒環境下處理日期但得出的結果卻是錯誤的情況,這也是在多執行緒環境開發中容易遇到的間題。
public class mythread extends thread
@override
public void run()
} catch (parseexception e)
}}public class run ;
mythread threadarray = new mythread[10];
for (int i=0; i<8; i++)
for (int i=0; i<8; i++)
}}
threadname=thread-2報錯了,日期字串:2001-01-03,轉換成的日期為:2001-01-01
threadname=thread-3報錯了,日期字串:2001-01-04,轉換成的日期為:2199-12-02
threadname=thread-1報錯了,日期字串:2001-01-02,轉換成的日期為:2199-12-02
threadname=thread-7報錯了,日期字串:2001-01-08,轉換成的日期為:2001-08-06
threadname=thread-5報錯了,日期字串:2001-01-06,轉換成的日期為:2001-08-06
從控制台中列印的結果來看,使用單例的******dateformat類在多執行緒的環境中處理日期,極易出現日期轉換錯誤的情況。
2、解決異常1:建立了多個類的例項
public class datetools
public static string format(string formatpattern, date date)
}
將mythread類的run方法修改為:
@override
public void run()
} catch (parseexception e)
}
控制台中沒有輸出任何異常,解決處理錯誤的原理其實就是建立了多個類的例項。
3、解決異常方法2:使用threadlocal類
前面介紹過,threadlocal類能使執行緒繫結到指定的物件。使用該類也可以解決多執行緒環境下******dateformat類處理錯誤的情況。
datetools修改為如下:
public class datetools
return sdf;
}}
mythread類裡的run方法修改為如下:
@override
public void run()
} catch (parseexception e)
}
控制台沒有錯誤資訊輸出。 多執行緒例項
include include include include define max 10 pthread t thread 2 pthread mutex t mut int number 0,i void thread1 printf thread1 主函式在等我完成任務嗎?n pthread ...
多執行緒,執行緒鎖,例項
多執行緒可以分多條執行緒,同時執行程式,但也因此出現一些問題,通過執行緒鎖可以解決 包子例項 廚師做包子,顧客吃包子,多餘50個包子廚師停止做包子,包子為零顧客停止吃包子,當廚師做到10個後顧客可以吃包子 顧客類 customer.class public class customer implem...
delphi 多執行緒例項
下面筆者將介紹乙個簡單的例項,解釋和說明前面所述的內容。1 建立form,在其中建立兩個按鈕 開始採集 和 停止採集 新增乙個paintbox1。2 建立乙個新的單元,在其中輸入以下 unit collectthread inte ce uses classes,sysutils,stdctrls,...