亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

fo循環中增加Runnable線程

fo循環中增加Runnable線程

慕慕森 2019-03-20 17:19:34
1 我有一個程序需要在for 循環中增加 Runnable,現在發現他執行的順序是從上往下 ,不是多線程的方式執行2 代碼如下public void addUserACard() {        ThreadLbData tLbData = null;    DbBean dbBean = null ;        List<DataBase> listData = dataDAO.findHql(" from DataBase where state = '1'  order by createDate desc ");    DataBase data = null ;    if(listData != null && listData.size()> 0){        for (int i = 0; i < listData.size(); i++) {            data = listData.get(i);            dbBean =  createDbBean(data);            tLbData = new ThreadLbData(dbBean);            tLbData.run();        }    }}}@SuppressWarnings("unchecked")public class ThreadLbData implements Runnable {private DbBean dataBase;private Map map = new HashMap();private static ConnectionPools connectionPools = ConnectionPools.getInstance();public ThreadLbData(DbBean dataBase) {    this.dataBase = dataBase;}public void run() {        Connection conn = connectionPools.getConnectionOracle(); // 獲得JDBC鏈接;    try {        String lbMaxId = this.getSynLogMaxId(dataBase, conn);        Map map = getLbDate(lbMaxId);        saveAll((List<ReaderCard>) map.get("listCard"), (List<Userinfo>)   map.get("listUser"), conn);    } catch (Exception e) {        e.printStackTrace();    }finally{        connectionPools.close(null, null, conn);    }}}3 想讓大神幫我看看,線程的run能不能并行,并且幫我改進,跪謝!
查看完整描述

2 回答

?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

用線程池唄!


private ExecutorService executorService = Executors.newFixedThreadPool(10);

public void addUserACard() {

    

    ThreadLbData tLbData = null;

    DbBean dbBean = null ;

    

    List<DataBase> listData = dataDAO.findHql(" from DataBase where state = '1'  order by createDate desc ");

    DataBase data = null ;

    if(listData != null && listData.size()> 0){

        for (int i = 0; i < listData.size(); i++) {

            data = listData.get(i);

            dbBean =  createDbBean(data);

            executorService.execute(tLbData);

        }

    }

}

private ExecutorService executorService = Executors.newFixedThreadPool(10);

上面的 Executors.newFixedThreadPool(10) 是創建了一個固定大小為10的線程池.

然后通過 executorService.execute( Runnable runnable) 的方式提交一個任務, 這樣可以最大并行地執行10個任務. 如果需要并行的線程更多, 那么 Executors.newFixedThreadPool(threadCount) 的參數可以設置大一些.


我要吐槽一下, 你應該是把 Runnable 接口和 Thread 類混淆了吧? 實現 Runnable 接口的類不代表它就是在一個新的線程中運行, 你必須顯示地地將 Runnable 提交到新線程中執行, 例如 executorService.execute(runnable) 或 new Thread(runnable).start().


查看完整回答
反對 回復 2019-04-26
?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

不能直接調用run方法,線程的執行要通過Thread.start方法。直接調用run方法和調用普通方法沒有區別。

new Thread(tLbData).start()


查看完整回答
反對 回復 2019-04-26
  • 2 回答
  • 0 關注
  • 688 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號