java - fo循环中增加Runnable线程

 刘洁05_836 发布于 2022-10-27 22:55

1 我有一个程序需要在for 循环中增加 Runnable,现在发现他执行的顺序是从上往下 ,不是多线程的方式执行

2 代码如下
public void addUserACard() {

    
    ThreadLbData tLbData = null;
    DbBean dbBean = null ;
    
    List 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) map.get("listCard"), (List)   map.get("listUser"), conn);
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        connectionPools.close(null, null, conn);
    }
}

}

3 想让大神帮我看看,线程的run能不能并行,并且帮我改进,跪谢!

2 个回答
  • 不能直接调用run方法,线程的执行要通过Thread.start方法。直接调用run方法和调用普通方法没有区别。

    new Thread(tLbData).start()
    2022-10-29 05:44 回答
  • 用线程池呗!

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

    2022-10-29 05:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有