`
xuyan2680
  • 浏览: 31764 次
  • 性别: 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,不是更加方便?

相关推荐

    典型的多线程--生产和消费

    1. **线程同步机制**:如上所述,`BlockingQueue`是如何实现线程安全的,包括其内部的锁机制、条件变量等。 2. **线程池的创建与管理**:`ExecutorService`的创建,如`Executors.newFixedThreadPool()`,以及如何...

    C# 高效线程安全,解决多线程写txt日志类.zip

    总的来说,这个"C# 高效线程安全,解决多线程写txt日志类.zip"提供的方案对于多线程环境下的日志管理有着显著的价值,通过合理的同步机制和优化策略,实现了日志写入的安全性和高效性。开发者可以通过学习和使用这个...

    winform 多线程处理数据

    在多线程环境中,为了防止数据竞争和资源冲突,需要使用锁、事件、信号量等机制进行线程同步。`Monitor`、`Mutex`、`Semaphore`和`AutoResetEvent`等类提供了相应的同步原语。 总结: Winform多线程处理数据是提高...

    多线程打开TXT

    6. **异步编程**:虽然多线程可以提高程序并行性,但在UI更新方面,推荐使用异步编程模型,如.NET Framework的`async/await`关键字,这样可以在不阻塞主线程的情况下执行IO密集型任务,保持用户界面的流畅响应。...

    Java线程间的通信----生产者消费者模型

    生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...

    java 多线程数据库操作

    在Java编程中,多线程技术常常用于提升应用程序的性能,特别是在处理大量数据时,如数据库操作。本主题将深入探讨如何在Java中利用多线程...在实际开发中,应根据项目需求和资源限制,选择合适的多线程模型和优化策略。

    C#处理大容量数据,及多线程简单应用

    C#作为一种强大的编程语言,提供了多种策略来高效地管理大数据并优化多线程应用,以提高性能和用户体验。以下将详细介绍“C#处理大容量数据,及多线程简单应用”这一主题。 首先,当我们面临大量数据时,一个关键的...

    ASP.NET多线程编程

    2. 并发处理:如批量数据上传,使用多线程并行处理提高效率。 3. 回调函数:使用委托或事件处理程序在工作线程完成时通知主线程。 综上所述,ASP.NET多线程编程是开发者必须掌握的重要技能,它能够帮助我们构建更...

    多线程模拟实现生产者/消费者模型

    生产者/消费者模型是多线程编程中的一个经典设计模式,它有效地利用了资源,避免了数据竞争和阻塞问题。这个模型的核心思想是将生产者和消费者分隔开,使得生产者可以专注于创建产品,而消费者则专注于消耗这些产品...

    kafka java单线程,多线程,多线程管理器代码

    不过,多线程消费者需要妥善处理线程间同步问题,例如确保所有线程正确提交偏移量,以避免消息丢失或重复。 多线程消费者管理器的设计是为了更有效地管理和协调这些线程。它通常包括任务分配、错误处理和线程间的...

    线程 福建移动批量复核太慢,后来就改用线程,但是没有效果

    1. **同步问题**:多线程环境下,如果没有正确地同步共享资源,可能会导致数据竞争和死锁,从而降低性能甚至引发错误。 2. **线程池配置不当**:如果没有适当地配置线程池大小,比如设置得过大或过小,都可能导致...

    c#多线程处理文档

    这篇未完成的项目似乎是在探讨如何在C#环境中有效地利用多线程来处理文档,这可能是为了实现并发读写、批量操作或者优化大型数据处理等场景。 多线程在C#中的实现主要依赖于`System.Threading`命名空间。在该命名...

    多线程正确调用,避免假死

    这确保了所有对UI的修改都在正确的上下文中执行,防止出现线程同步问题。 5. **避免共享数据冲突**:多线程访问共享数据可能导致竞态条件,使用锁、监视器(Monitor)、信号量(Semaphore)等同步原语可以避免这种...

    并发编程基础知识,java内存模型及多线程、volatile

    ### 并发编程基础知识,Java内存模型及多线程、volatile #### Java内存模型(JMM) Java内存模型(Java Memory Model, JMM)是Java并发编程的基础之一,它定义了一套规则来保证线程之间的数据可见性和一致性。当程序...

    20_来聊聊redis的线程模型吧?为啥单线程还能有很高的效率?.zip

    单线程模型的优势在于避免了多线程环境下的竞态条件和锁同步问题,简化了代码的复杂性,提高了可维护性。此外,由于所有操作都在同一个线程中执行,Redis可以确保命令的顺序执行,这对于一些需要事务或原子性的操作...

    PHP多线程图片处理

    但是,通过一些技巧和扩展,我们可以模拟实现多线程的功能。本篇将深入探讨如何利用CURL扩展来实现这一目标,以及在这个过程中可能遇到的关键知识点。 1. **CURL扩展**:CURL是PHP中的一个库,全称为Client URL ...

    多线程编程指南

    多线程编程是一种编程模型,它允许程序在多个线程上并行执行任务,从而提高应用程序的性能和响应速度。线程是操作系统能够进行运算调度的最小单位,一个标准的程序只能进行一个任务直到完成才能执行下一个任务;若有...

    Core Data多线程操作

    在多线程环境中,为了保证应用的响应速度和用户体验,我们需要有效地利用多线程进行数据处理,特别是在进行大量数据读写时。本教程将深入探讨如何在多线程环境下进行Core Data的操作,包括创建(Create)、读取...

    Java多线程优化百万级数据

    4. **同步机制**:在多线程共享资源时,合理使用`synchronized`关键字、`Lock`接口(如`ReentrantLock`)以及`volatile`关键字,确保数据一致性并避免竞态条件。 5. **I/O优化**:对于数据库操作,可以使用JDBC...

    多线程Python程序示例

    下面我们将详细讨论多线程的基本概念、创建与使用、线程同步以及线程安全等问题。 1. **线程基础** - **线程定义**:线程是程序执行的最小单元,一个进程可以有多个线程。 - **线程对象**:在Python中,通过`...

Global site tag (gtag.js) - Google Analytics