多執行緒例項

2021-08-29 20:51:47 字數 2243 閱讀 1355

正常的情況下,執行緒在執行時多個執行緒之間執行任務的時機是無序的。可以通過改造**的方式使它們執行具有有序性。

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,...