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

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能不能并行,并且帮我改进,跪谢!

阿神
阿神

闭关修行中......

reply all(2)
黄舟

Use thread pool!

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);

The above Executors.newFixedThreadPool(10) creates a thread pool with a fixed size of 10.
Then submit a task through executorService.execute( Runnable runnable), so that a maximum of 10 tasks can be executed in parallel . If more parallel threads are needed, the parameters of Executors.newFixedThreadPool(threadCount) can be set larger.


I want to complain, you must have confused the Runnable interface with the Thread class, right? A class that implements the Runnable interface does not mean that it runs in a new thread. You must explicitly submit the Runnable to the new thread for execution. For example executorService.execute(runnable) or new Thread(runnable).start().

刘奇

The run method cannot be called directly, the thread must be executed through the Thread.start method. There is no difference between calling the run method directly and calling a normal method.

new Thread(tLbData).start()
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!