`
xuyan2680
  • 浏览: 30991 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

多线程---批量线程同步模型

阅读更多

在一批线程处理程序中,有时必须等到所有线程全部运行完后,才能进行下一步任务处理,
可以采用如下方法解决,创建一个锁对象 ,该锁对象提供一个当前线程等待其他线程的方法。见代码:

/**
 * 
 * 此类主要用来处理线程的同步屏蔽模型,比如,一批线程运行,必须在最后一个线程运行
 * 完后,才能进行下一步的操作,那么就可以创建一个锁对象,锁对象提供一个线程等待其他线程
 * 的方法,如果当前线程运行时,还有未运行的线程,则此线程wait,否则,此线程唤醒其他阻塞的
 * 线程,进而最终完成线程的运行
 * */
public class LockObject {

	private int totalThread = 0;
	private int currentThread = 0;

	public LockObject(int totalThread) {
		this.totalThread = totalThread;
		this.currentThread = 1;
	}

	public synchronized void waitForOtherThread() {
		if (this.currentThread < this.totalThread) {
			this.currentThread++;
			try {
				this.wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			this.currentThread = 1;
			notifyAll();
		}
	}

	public int getTotalThread() {
		return totalThread;
	}

	public void setTotalThread(int totalThread) {
		this.totalThread = totalThread;
	}

	public int getCurrentThread() {
		return currentThread;
	}

	public void setCurrentThread(int currentThread) {
		this.currentThread = currentThread;
	}
}
此对象提供 二个私有变量,totalThread 的初始值为所运行的线程的总数,currentThread 为当前正在运行的线程数。
线程运行时处理完自己的任务后调用方法waitForOtherThread 等待其他线程结束,即当前运行线程数与线程总数的比较
如果运行线程数小于线程总数,则当前运行线程数+1 后,当前线程进入等待状态,否则,唤醒其他等待线程。

 见测试程序

public class MyThread extends Thread {
	public static LockObject lo = new LockObject(1000);

	public MyThread(String threadName) {
		super(threadName);
	}

	public void run() {
			System.out.println(Thread.currentThread().getName() + " ----开始运行");
			lo.waitForOtherThread();
			System.out.println(Thread.currentThread().getName() + " ----结束运行");
	}

	public static void main(String[] args) {
		for (int i = 1; i <= 1000; i++) {
			Thread thread = new MyThread("第" + i + "个线程");
			thread.setPriority(NORM_PRIORITY);
			thread.start();
		}
	}

}

 。。。。。。。。初次发帖,如有不妥,欢迎拍砖!

9
0
分享到:
评论
8 楼 tianshiyeben 2009-09-17  
学习了    楼主强啊  
7 楼 kind790 2009-09-16  
CountDownLatch  or CyclicBarrier
6 楼 xuyan2680 2009-09-15  
anson2003 写道
很简单的事情:

List<Thread> threadList = new LinkedList<Thread>();
for(int i=0;i<1000;i++){
   Thread t = new MyThread();
   threadList.add(t);
   t.start();
}

for(Thread t : threadList){
    try{
         t.join();
    }catch (InterruptedException e) {  
    }

}


学习嘛,究其原!
5 楼 anson2003 2009-09-15  
很简单的事情:

List<Thread> threadList = new LinkedList<Thread>();
for(int i=0;i<1000;i++){
   Thread t = new MyThread();
   threadList.add(t);
   t.start();
}

for(Thread t : threadList){
    try{
         t.join();
    }catch (InterruptedException e) {  
    }

}

4 楼 xuyan2680 2009-09-15  
多谢大家光顾!
3 楼 only_java 2009-09-15  
不错,简单明了!
2 楼 xuyan2680 2009-09-14  
liangguanhui 写道
在Java1.5,直接用线程池,然后awaitTerminate,不是更加方便?

呵呵,确实是方便些,来一下模拟实现,会理解的更深些。
1 楼 liangguanhui 2009-09-14  
在Java1.5,直接用线程池,然后awaitTerminate,不是更加方便?

相关推荐

    List-of-Parallel-JS-Projects:并行和共享内存Javascript设计和实现列表

    并行性的类型:如何创建和管理进程/线程Fork-Join-显式创建新线程/进程批量同步并行-执行程序时,将启动固定数量的进程,所有进程都在main()处进入程序。 循环级别-循环迭代分布到多个进程/线程异步-非阻塞函数调用...

    互联网创意产品众筹平台

    │ 1-用户管理模块-批量删除功能实现(多条数据原理), o. M3 p. O P# s* L1 E5 n' f │ 2-抽取menu.jsp │ 3-被点中的菜单标红,并默认展开 │ ├─众筹项目-第07天《Atcrowdfunding》 │ ├─代码 │ ├─笔记 │ ...

    御剑高速tcp全端口扫描工具

    主要是采用了.NET中的异步模型加事件通知(俗称IOCP),可能涉及到重复造轮子的嫌疑,但是确实要比很多端口扫描程序的速度要快上很多,因为没有采用多线程,相对来说线程占用不多,所以内存控制的还算比较不错!...

    基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)

    如果采用多线程、多进程的方案确实有效,但编写麻烦、消耗系统资源大(pymongo还不允许fork线程中共用连接)。这里主要瓶颈在于IO,使用单线程异步操作就会效果很好。 Motor是一个异步mongodb driver,支持异步读写...

    java开源包1

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包10

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    最新Java面试题视频网盘,Java面试题84集、java面试专属及面试必问课程

    │ │ 9.JAVA并发编程之多线程并发同步业务场景与解决方案.wmv │ │ │ ├─10.微服务架构之Spring Cloud Eureka 场景分析与实战 │ │ 10.微服务架构之Spring Cloud Eureka 场景分析与实战.wmv │ │ │ ├─11....

    java开源包11

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包2

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包3

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包6

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包5

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包4

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包8

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包7

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包9

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java开源包101

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    Java资源包01

    MyBatchFramework 是一个开源的轻量级的用以创建可靠的易管理的批量作业的Java包,主要特点是多线程、调度、JMX管理和批量执行报表,执行历史等。 SIP协议包 jSIP.tar jSIP这个Java包目标是用Java实现SIP(SIP:...

    java面试800题

    volatile:volatile变量表示保证它必须是与主内存保持一致,它实际是""变量的同步"", 也就是说对于volatile变量的操作是原子型的,如用在long 或 double变量前,一般用于多线程编程。 abstract:抽象,必须重载,修饰...

Global site tag (gtag.js) - Google Analytics