多线程中的task中的业务逻辑代码没有执行

KeepSayingNo 华为 开发组长/高级工程师/技术专家  2016-07-16 09:45:32
写了一个task类实现了runnable接口

public class IncTask implements Runnable {

public void run() {
Thread thread = Thread.currentThread();
System.out.println("hello_____________"+thread.getId()+":"+thread.getName());

try{
// 执行入库的操作,代码省略
Thread.sleep(1000);
} catch (Exception ex) {
System.out.println(ex.getMessage());
}

}

}


然后写了一个测试类,里面构建了一个线程池,进行操作

public class ThreadTest {
@Test
public void testThread() {
ExecutorService executor = Executors.newFixedThreadPool(3);

for(int i =0;i<6;i++){
IncTask incThread = new IncTask();
executor.execute(incThread);
}

executor.shutdown();
}
}


如果在IncTask 类中没有入库的代码,则会在执行结果中显示有3个线程总共进行了6次操作。但是如果有了入库的代码,则只会有3个线程进行了3次操作,但是没有入库的记录。请教大神怎么样能在有入库的代码的时候进行6次入库的操作。
...全文
125 点赞 收藏 6
写回复
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
run内操作db是如何实现的?多线程要结束连接池才行,连接释放db的操作拿到run外。
回复
KeepSayingNo 2016-07-18
引用 4 楼 rickylin86的回复:
[quote=引用 2 楼 dotnetstudio 的回复:] 我说的就是IncTask 这个类只会执行system.println.out的操作,在try里面的业务代码就不会执行,例如插数据到数据库
那只能说明你数据库的操作代码有问题.[/quote] 我不用线程池,用单线程是可以的
回复
rickylin86 2016-07-17
引用 2 楼 dotnetstudio 的回复:
我说的就是IncTask 这个类只会执行system.println.out的操作,在try里面的业务代码就不会执行,例如插数据到数据库
那只能说明你数据库的操作代码有问题.
回复
rickylin86 2016-07-17
不明白你说的是什么. Executors.newFixedThreadPool(3)用这个新建的执行器同时间只能三个线程执行,其他的等待.然后有什么疑问吗?你说的入库是什么呢?
回复
KeepSayingNo 2016-07-17
引用 1 楼 rickylin86 的回复:
不明白你说的是什么. Executors.newFixedThreadPool(3)用这个新建的执行器同时间只能三个线程执行,其他的等待.然后有什么疑问吗?你说的入库是什么呢?
是的,确实只有3个线程执行,然后会执行6次,但是IncTask中的try里面的插数据到数据库的操作不执行
回复
KeepSayingNo 2016-07-17
我说的就是IncTask 这个类只会执行system.println.out的操作,在try里面的业务代码就不会执行,例如插数据到数据库
回复
发动态
发帖子
Java SE
创建于2007-09-28

6.1w+

社区成员

Java 2 Standard Edition
申请成为版主
社区公告
暂无公告