[問題] Java Synchronized 請益
向各位前輩請教一個Synchronized用法的問題
我的程式讀取一個檔案,將檔案內每一行資料個別用一個Thread處理
一次最多用10個thread,並用一個Thread counter去記錄目前已經開了幾個Thread出去
每讀取檔案的一行資料,先檢查Thread counter是否已經開滿了Thread
如果滿了就等待0.1秒再繼續檢查
開出來的Thread在執行完畢後會將 Thread 數目從Thread counter刪去
--------------------部分程式碼----------------
while ((strLine = br.readLine()) != null) {
while(((Integer)threadCount.get("thread")).intValue()>=10){
Thread.sleep(100); //檢查thread是否已經超過10條,超過的話sleep 0.1秒再檢查
}
synchronized(threadCount){ //開新的thread
int count = ((Integer)threadCount.get("thread")).intValue();
threadCount.put("thread", new Integer(count+1));
ProcessChartTasker charttasker = new ProcessChartTasker(threadCount);
Thread thread = new Thread(charttasker);
thread.start();
}
}
ProcessChartTasker中,程式執行完畢後會執行下列程式碼將Thread數回收
synchronized(this.threadCount){
int count = ((Integer)this.threadCount.get("thread")).intValue();
this.threadCount.put("thread",new Integer(count-1));
}
目前測試起來在某些狀況下,同一Thread好像不會完全開出10條,甚至當將Thread的數量加大到30時
同時間卻可能只有12~14左右的Thread在執行,甚至要等原本開出來的Thread都執行完畢,才會繼續
開新的Thread
小弟猜想是不是因為在主Thread中synchronized(threadCount),而sub-thread在結束時也會synchronized(this.threadCount)
導致當sub-thread數量增加時,主thread因為搶不到threadCount而無法開出新的Thread?
當其他sub-thread synchronized(this.threadCount)時,在主Thread中檢察Thread Count數量的方法是否會無法取得Thread count數量?
又或是有比較好的檢查機制?煩請各位前輩賜教,謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 111.251.197.148
→
04/30 00:47, , 1F
04/30 00:47, 1F
→
05/05 06:51, , 2F
05/05 06:51, 2F