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能不能并行,并且帮我改进,跪谢!
黄舟2017-04-18 10:19:32
스레드풀을 활용해보세요!
으아아아위 Executors.newFixedThreadPool(10)은 고정 크기 10의 스레드 풀을 생성합니다.
그런 다음 executorService.execute( Runnable runnable)을 통해 제출합니다. 최대 10개의 작업을 병렬로 실행할 수 있습니다. 더 많은 병렬 스레드가 필요한 경우 Executors.newFixedThreadPool(threadCount)의 매개변수를 더 크게 설정할 수 있습니다.
Runnable 인터페이스와 Thread 클래스를 혼동했어야 한다고 불평하고 싶습니다. Runnable 인터페이스를 구현하는 클래스가 새 스레드에서 실행된다는 의미는 아닙니다. Runnable을 새 스레드에 명시적으로 제출해야 합니다. . executorService.execute(runnable) 또는 new Thread(runnable).start()와 같은 실행.
怪我咯2017-04-18 10:19:32
run 메소드는 직접 호출할 수 없으며 Thread.start 메소드를 통해 스레드를 실행해야 합니다. run 메소드를 직접 호출하는 것과 일반 메소드를 호출하는 것에는 차이가 없습니다.
으아아아