原來(lái)是把List集合用for循環(huán)操作,現(xiàn)在想用多線程來(lái)弄,想提高點(diǎn)速度。這是先做了個(gè)小例子,然后就發(fā)現(xiàn)出問(wèn)題了。停不下來(lái)。。。繼承Runnable接口的類(lèi)里的Run方法是這樣的, public void run() { // TODO Auto-generated method stub // while (index <list.size()) { list.get(index).append("namerate", list.get(index).getString("name")+list.get(index).getString("rate")); System.out.println(Thread.currentThread().getName()+ "正在處理"+this.index++); } }在main方法是這樣用的 List<Document> list = poitest.getData(); MyThread myThread = new MyThread(list); new Thread(myThread, "1號(hào)線程").start(); new Thread(myThread, "2號(hào)線程").start(); new Thread(myThread, "3號(hào)線程").start(); new Thread(myThread, "4號(hào)線程").start(); new Thread(myThread, "5號(hào)線程").start(); while (flag) { if (myThread.getIndex() >= list.size()) { // System.out.println("最后"+myThread.getIndex()); flag = false; } // System.out.println(myThread.getIndex()>= list.size()); // System.out.println("mainflag:"+flag); }下面的兩個(gè)無(wú)論哪個(gè)取消注釋?zhuān)寄芡V埂5亲⑨尯螅惋@示還在運(yùn)行。我用debug來(lái)看線程的話是這樣的Thread [main] (Running) Daemon Thread [cluster-ClusterId{value='58083c114d7c9d336ce66915', description='null'}-127.0.0.1:27017] (Running) Daemon Thread [pool-2-thread-1] (Running)不知道為啥會(huì)這樣,我加斷點(diǎn)用F5執(zhí)行完卻也能結(jié)束。。。其實(shí)就是想用多線程來(lái)處理集合,處理完后再返回,所以我得在main里面判斷多線程是否結(jié)束,然后才能執(zhí)行后面的??蛇@個(gè)問(wèn)題很是詫異啊。我也是菜鳥(niǎo),看網(wǎng)上都說(shuō)用線程池什么的,但我想解決我這個(gè)問(wèn)題。之后再有什么鎖的問(wèn)題到時(shí)再看。。。
5 回答

HUX布斯
TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超6個(gè)贊
ExecutorService exec = Executors.newFixedThreadPool(8);
for(final Object obj : list){
exec.execute(new Runnable() {
@Override
public void run() {
process(obj)
}
});
}
我覺(jué)得使用這種方式更好。

慕標(biāo)琳琳
TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
建議給每個(gè)線程限定處理集合的索引范圍,即分片。
比如:
一共有5個(gè)線程,線程1處理前1/5,線程2處理1/5~2/5...
換成直觀理解就是,假設(shè)有100個(gè)元素,線程1的索引范圍為0~19,線程2的索引范圍為20~39...
這樣能避免線程之間操作相同數(shù)據(jù),避免了可能的線程不安全問(wèn)題。
添加回答
舉報(bào)
0/150
提交
取消