java - fo循环中增加Runnable线程
阿神
阿神 2017-04-18 10:17:32
0
2
538

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)
黄舟

用線程池唄!

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().

刘奇

不能直接呼叫run方法,執行緒的執行要透過Thread.start方法。直接呼叫run方法和呼叫普通方法沒有差別。

new Thread(tLbData).start()
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!