多线程的批量线程同步解决方案
创始人
2024-06-07 00:51:38
0

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

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

  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#完全限定名简单分析

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...