【求教】关于java多线程的需求

yangfengshan 2012-11-04 06:38:53
很久没有弄java了,还请各位大神帮忙看看以下需求如何实现?

先取出多个ID,然后每个ID启动一个线程,ID作为参数传给线程,
所有线程都结束后判断结果,都没有错误commit;否则rollback。

多谢了
...全文
271 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙四 2012-11-05
  • 打赏
  • 举报
回复
引用 6 楼 ticmy 的回复:
引用 3 楼 yangfengshan 的回复:现在我所关心的不是数据库事务这块,这块我们可以暂时不管, 我关心的是线程这块如何做? 还请帮帮忙!! CountDownLatch这个类就是你要的
example:

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestCountDownLatch {
	public static void main(String[] args) throws Exception {
//		ExecutorService threadPool = Executors.newFixedThreadPool(5);
		ExecutorService threadPool = Executors.newCachedThreadPool();
		int[] ids = new int[150];
		for(int i=0; i<ids.length; i++) {
			ids[i] = i + 1;
		}
		CountDownLatch latch = new CountDownLatch(ids.length);
		
		for(int i=0; i<ids.length; i++) {
			threadPool.execute(new Task(ids[i], latch));
		}
		
		latch.await();
		System.out.println("所有线程都执行完了");
		
		threadPool.shutdown();
	}
	
	static class Task implements Runnable {
		long id = 0;
		CountDownLatch latch;
		public Task(long id, CountDownLatch latch) {
			this.id = id;
			this.latch = latch;
		}
		public void run() {
			try {
				System.out.println("task" + id + " by " + Thread.currentThread().getId());
				Thread.sleep(500);
			} catch (Exception e) {
			} finally {
				latch.countDown();
			}
		}
		
	}
}
龙四 2012-11-05
  • 打赏
  • 举报
回复
引用 3 楼 yangfengshan 的回复:
现在我所关心的不是数据库事务这块,这块我们可以暂时不管, 我关心的是线程这块如何做? 还请帮帮忙!!
CountDownLatch这个类就是你要的
panzhixiong_cn 2012-11-05
  • 打赏
  • 举报
回复
这个需求有点奇怪啊?是大学实验室用的吗?现实工作中几乎不这么用线程的
yangfengshan 2012-11-05
  • 打赏
  • 举报
回复
线程出错了要告知调用的程序,然后调用的程序再根据线程是否出错,进行不同的处理
龙四 2012-11-05
  • 打赏
  • 举报
回复
引用 8 楼 yangfengshan 的回复:
引用 7 楼 ticmy 的回复:引用 6 楼 ticmy 的回复: 引用 3 楼 yangfengshan 的回复:现在我所关心的不是数据库事务这块,这块我们可以暂时不管, 我关心的是线程这块如何做? 还请帮帮忙!! CountDownLatch这个类就是你要的 example: Java code 1234567891……
出错了是要作什么处理
yangfengshan 2012-11-05
  • 打赏
  • 举报
回复
引用 7 楼 ticmy 的回复:
引用 6 楼 ticmy 的回复: 引用 3 楼 yangfengshan 的回复:现在我所关心的不是数据库事务这块,这块我们可以暂时不管, 我关心的是线程这块如何做? 还请帮帮忙!! CountDownLatch这个类就是你要的 example: Java code 1234567891011121314151617181920212223242……
CountDownLatch如何判断线程中是否出错? 目前好像只是能够等待所有线程都结束。
三卷书度日 2012-11-04
  • 打赏
  • 举报
回复
可以考虑 定义回调接口 与id一起做为参数传递给子线程 该接口对象负责通知父线程其完成状态 成功或者失败 父线程等待左右子线程结束后根据结果确定commit或者rollback
yangfengshan 2012-11-04
  • 打赏
  • 举报
回复
现在我所关心的不是数据库事务这块,这块我们可以暂时不管, 我关心的是线程这块如何做? 还请帮帮忙!!
龙四 2012-11-04
  • 打赏
  • 举报
回复
且Connection不是线程安全的 ps:发现新版的bbs可以编辑帖子了嘛
MiceRice 2012-11-04
  • 打赏
  • 举报
回复
每个线程分别做数据库操作,然后打算一起Commit? 基本不可行。。。 基于数据库事务管理的情况下,你只能在同一个Connection中来保持事务。 你这个需求有点类似于要实现分布式事务,难度太高。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧