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

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

阿神
阿神

闭关修行中......

répondre à tous(2)
黄舟

Utilisez le pool de threads !

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

Le Executors.newFixedThreadPool(10) ci-dessus crée un pool de threads avec une taille fixe de 10.
puis le soumet via executorService.execute( Runnable runnable) A tâche, de sorte qu'un maximum de 10 tâches puissent être exécutées en parallèle. Si davantage de threads parallèles sont requis, alors les paramètres de Executors.newFixedThreadPool(threadCount) peuvent être définis plus grands.


Je veux me plaindre, vous auriez dû confondre l'interface Runnable et la classe Thread, non ? Une classe qui implémente l'interface Runnable ne signifie pas qu'elle s'exécute dans un nouveau thread. Vous devez explicitement soumettre le Runnable au nouveau thread. . Exécution, telle que executorService.execute(runnable) ou new Thread(runnable).start().

.
刘奇

La méthode run ne peut pas être appelée directement, le thread doit être exécuté via la méthode Thread.start. Il n'y a aucune différence entre appeler directement la méthode run et appeler la méthode ordinaire.

new Thread(tLbData).start()
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!