多线程的批量线程同步解决方案

开发 后端
本文介绍多线程的批量线程同步解决方案。解决方法是,创建一个锁对象,该锁对象提供一个当前线程等待其他线程的方法。

多线程运行时有待处理线程?试试看下面介绍的这个批量线程同步方法吧。

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

  1. /**  
  2.  *   
  3.  * 此类主要用来处理线程的同步屏蔽模型,比如,一批线程运行,必须在最后一个线程运行  
  4.  * 完后,才能进行下一步的操作,那么就可以创建一个锁对象,锁对象提供一个线程等待其他线程  
  5.  * 的方法,如果当前线程运行时,还有未运行的线程,则此线程wait,否则,此线程唤醒其他阻塞的  
  6.  * 线程,进而最终完成线程的运行  
  7.  * */ 
  8. public class LockObject {  
  9.  
  10.  private int totalThread = 0;  
  11.  private int currentThread = 0;  
  12.  
  13.  public LockObject(int totalThread) {  
  14.   this.totalThread = totalThread;  
  15.   this.currentThread = 1;  
  16.  }  
  17.  
  18.  public synchronized void waitForOtherThread() {  
  19.   if (this.currentThread < this.totalThread) {  
  20.    this.currentThread++;  
  21.    try {  
  22.     this.wait();  
  23.    } catch (InterruptedException e) {  
  24.     // TODO Auto-generated catch block  
  25.     e.printStackTrace();  
  26.    }  
  27.   } else {  
  28.    this.currentThread = 1;  
  29.    notifyAll();  
  30.   }  
  31.  }  
  32.  
  33.  public int getTotalThread() {  
  34.   return totalThread;  
  35.  }  
  36.  
  37.  public void setTotalThread(int totalThread) {  
  38.   this.totalThread = totalThread;  
  39.  }  
  40.  
  41.  public int getCurrentThread() {  
  42.   return currentThread;  
  43.  }  
  44.  
  45.  public void setCurrentThread(int currentThread) {  
  46.   this.currentThread = currentThread;  
  47.  }  
  48. }  
  49.  

批量线程同步机制介绍

此对象提供 二个私有变量,totalThread 的初始值为所运行的线程的总数,currentThread 为当前正在运行的线程数。

线程运行时处理完自己的任务后调用方法waitForOtherThread 等待其他线程结束,即当前运行线程数与线程总数的比较

如果运行线程数小于线程总数,则当前运行线程数+1 后,当前线程进入等待状态,否则,唤醒其他等待线程。

见测试程序

  1. public class MyThread extends Thread {  
  2.  public static LockObject lo = new LockObject(1000);  
  3.  
  4.  public MyThread(String threadName) {  
  5.   super(threadName);  
  6.  }  
  7.  
  8.  public void run() {  
  9.    System.out.println(Thread.currentThread().getName() + " ----开始运行");  
  10.    lo.waitForOtherThread();  
  11.    System.out.println(Thread.currentThread().getName() + " ----结束运行");  
  12.  }  
  13.  
  14.  public static void main(String[] args) {  
  15.   for (int i = 1; i <= 1000; i++) {  
  16.    Thread thread = new MyThread("第" + i + "个线程");  
  17.    thread.setPriority(NORM_PRIORITY);  
  18.    thread.start();  
  19.   }  
  20.  }  
  21.  
  22. }  

以上就介绍了批量线程同步的实现。

【编辑推荐】

  1. C#线程同步详细分析
  2. 运用C#数据提供者
  3. C#允许运算符重载剖析
  4. Java和C#顶层声明概述
  5. C#完全限定名简单分析
责任编辑:yangsai 来源: JavaEye博客
相关推荐

2009-07-15 17:09:32

Swing线程

2012-05-18 11:17:58

Java多线程

2010-01-21 11:27:30

linux多线程机制线程同步

2015-07-22 09:39:38

IOS多线程同步

2015-07-22 09:51:51

iOS开发线程

2013-07-16 12:13:27

iOS多线程多线程概念GCD

2009-03-18 09:26:23

Winform多线程C#

2011-06-22 13:57:54

Java多线程

2011-06-22 13:47:16

Java多线程

2010-03-15 19:37:00

Java多线程同步

2011-04-14 13:27:53

Synchronize多线程

2010-01-21 11:22:35

Linux多线程同步

2021-05-17 07:51:44

SimpleDateF线程安全

2010-01-21 11:23:49

Linux多线程同步消息队列

2009-03-24 08:56:23

数据同步多线程Java

2009-07-01 17:34:03

Servlet和JSP

2015-09-10 09:30:54

Java多线程同步

2022-04-07 07:40:40

线程安全变量

2024-02-27 10:44:58

C#线程后端

2024-07-05 08:32:36

点赞
收藏

51CTO技术栈公众号