`

java线程:几个实用的线程工具类

 
阅读更多

 

java线程:几个实用的线程工具类

分类: java_线程 89人阅读 评论(0) 收藏 举报

CyclicBarrier

[java] view plaincopy
  1. import java.util.concurrent.CyclicBarrier;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4.   
  5. /** 
  6.  * @author amber2012 
  7.  *  
  8.  * CyclicBarrier: 
  9.  * 表示线程彼此等待,等所有的线程都集合后,才开始做任务 
  10.  *  
  11.  */  
  12. public class CyclicBarrierTest {  
  13.   
  14.     public static void main(String[] args) {  
  15.         ExecutorService service = Executors.newCachedThreadPool();  
  16.         final  CyclicBarrier cb = new CyclicBarrier(3);  
  17.         for(int i=0;i<3;i++){  
  18.             Runnable runnable = new Runnable(){  
  19.                     public void run(){  
  20.                     try {  
  21.                         Thread.sleep((long)(Math.random()*10000));    
  22.                         System.out.println("线程" + Thread.currentThread().getName() +   
  23.                                 "即将到达集合地点1,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                         
  24.                         cb.await();  
  25.                           
  26.                         Thread.sleep((long)(Math.random()*10000));    
  27.                         System.out.println("线程" + Thread.currentThread().getName() +   
  28.                                 "即将到达集合地点2,当前已有" + (cb.getNumberWaiting()+1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));  
  29.                         cb.await();   
  30.                         Thread.sleep((long)(Math.random()*10000));    
  31.                         System.out.println("线程" + Thread.currentThread().getName() +   
  32.                                 "即将到达集合地点3,当前已有" + (cb.getNumberWaiting() + 1) + "个已经到达," + (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));                       
  33.                         cb.await();                       
  34.                     } catch (Exception e) {  
  35.                         e.printStackTrace();  
  36.                     }                 
  37.                 }  
  38.             };  
  39.             service.execute(runnable);  
  40.         }  
  41.         service.shutdown();  
  42.     }  
  43. }  

CountDownLatch:
[java] view plaincopy
  1. import java.util.concurrent.CountDownLatch;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4.   
  5. /** 
  6.  * @author amber2012 
  7.  *  
  8.  * CountDownLatch: 
  9.  * 好比倒计时计数器,调用CountDownLatch对象的CountDown方法就将计数器减1,当计数器到达0时,则所有等待线程 
  10.  * 或单个等待线程开始执行。 
  11.  */  
  12. public class CountdownLatchTest {  
  13.   
  14.     public static void main(String[] args) {  
  15.       
  16.         ExecutorService service = Executors.newCachedThreadPool();  
  17.         // 创建两个计数器,cdOrder的初始值为1,cdAnswer初始值为3  
  18.         final CountDownLatch cdOrder = new CountDownLatch(1);  
  19.         final CountDownLatch cdAnswer = new CountDownLatch(3);        
  20.           
  21.         for(int i=0;i<3;i++){  
  22.             Runnable runnable = new Runnable(){  
  23.                     public void run(){  
  24.                     try {  
  25.                         System.out.println("线程" + Thread.currentThread().getName() + "正准备接受命令");                          
  26.                         cdOrder.await(); // 所有的线程都在此等待,并希望被其他线程调用cdOrder.countDown()激活,在这里由主线程激活  
  27.                           
  28.                         System.out.println("线程" + Thread.currentThread().getName() + "已接受命令");                                
  29.                         Thread.sleep((long)(Math.random()*10000));    
  30.                           
  31.                         System.out.println("线程" + Thread.currentThread().getName() + "回应命令处理结果");                         
  32.                         cdAnswer.countDown();// cdAnswer计数器的初始值为3,,三个线程到达后调用cdAnswer.countDown()到计数为0,激活主线程  
  33.                     } catch (Exception e) {  
  34.                         e.printStackTrace();  
  35.                     }                 
  36.                 }  
  37.             };  
  38.             service.execute(runnable);  
  39.         }         
  40.           
  41.         try {  
  42.             Thread.sleep((long)(Math.random()*10000));  
  43.           
  44.             System.out.println("线程" + Thread.currentThread().getName() + "即将发布命令");                       
  45.             cdOrder.countDown();// 主线程将cdOrder计数器减1  
  46.               
  47.             System.out.println("线程" + Thread.currentThread().getName() + "已发送命令,正在等待结果");     
  48.             cdAnswer.await();// 主线程正在等待,希望被其他线程激活  
  49.               
  50.             System.out.println("线程" + Thread.currentThread().getName() + "已收到所有响应结果");    
  51.         } catch (Exception e) {  
  52.             e.printStackTrace();  
  53.         }                 
  54.         service.shutdown();  
  55.     }  
  56. }  

Exchanger:
[java] view plaincopy
  1. import java.util.concurrent.Exchanger;  
  2. import java.util.concurrent.ExecutorService;  
  3. import java.util.concurrent.Executors;  
  4.   
  5. /** 
  6.  * @author amber2012 
  7.  *  
  8.  * Exchanger: 
  9.  * 用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人将一直等待第二 
  10.  * 个人拿着数据到来时,才能彼此交换数据。 
  11.  */  
  12. public class ExchangerTest {  
  13.   
  14.     public static void main(String[] args) {  
  15.         ExecutorService service = Executors.newCachedThreadPool();  
  16.         final Exchanger exchanger = new Exchanger();  
  17.           
  18.         service.execute(new Runnable(){  
  19.             public void run() {  
  20.                 try {                 
  21.                     String data1 = "zxx";  
  22.                     System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去");  
  23.                     Thread.sleep(1000L);  
  24.                       
  25.                     String data2 = (String)exchanger.exchange(data1);  
  26.                     System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);  
  27.                 }catch(Exception e){  
  28.                 }  
  29.             }     
  30.         });  
  31.           
  32.         service.execute(new Runnable(){  
  33.             public void run() {  
  34.                 try {                 
  35.                     String data1 = "lhm";  
  36.                     System.out.println("线程" + Thread.currentThread().getName() + "正在把数据" + data1 +"换出去");  
  37.                     Thread.sleep(2000L);                      
  38.                       
  39.                     String data2 = (String)exchanger.exchange(data1);  
  40.                     System.out.println("线程" + Thread.currentThread().getName() + "换回的数据为" + data2);  
  41.                 }catch(Exception e){  
  42.                 }                 
  43.             }     
  44.         });       
  45.     }  
  46. }  
分享到:
评论

相关推荐

    java源码:Java线程错误捕获工具 CheckThread.zip

    Java线程错误捕获工具CheckThread是一个用于监控和管理Java应用程序中线程异常的重要工具。在多线程编程中,由于并发执行的特性,错误处理变得复杂,有时异常可能不会立即抛出,而是隐藏在后台线程中,导致程序运行...

    Java多线程

    通过使用`Callable`接口和`FutureTask`类,Java线程可以返回结果。这种方式比传统使用`Thread`类更加灵活。 #### 十四、Java线程:新特征-锁(上) Java提供了一套高级的锁机制,如`ReentrantLock`,这允许更精细...

    JAVA多线程聊天工具

    Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`和`notifyAll()`方法,以及`java.util.concurrent`包下的各种高级并发工具类,如`Semaphore`, `CountDownLatch`, `CyclicBarrier`等。...

    电子书《java线程》

    5. **并发工具类**:如CountDownLatch、CyclicBarrier、Semaphore和Future,这些工具类提供了更高级别的同步和协调机制。 6. **死锁**:当两个或更多线程相互等待对方释放资源时,可能会出现死锁现象,学习如何预防...

    Java多线程知识点总结

    随着Java版本的更新,Java也引入了新的并发工具类,例如java.util.concurrent包下的并发集合、原子操作类以及各种并发控制类,这些工具类提供了比传统synchronized和volatile关键字更强大、更灵活的线程同步控制机制...

    深入学习:Java多线程编程

    4. **并发工具类**:Java的并发包(java.util.concurrent)包含许多高效并发工具,如CountDownLatch、CyclicBarrier、Future和Callable,它们在多线程编程中扮演重要角色。 5. **并发集合**:线程安全的集合类,如...

    多线程断点续传工具类

    在具体使用时,开发者可以实例化这个工具类,设置必要的参数(如文件路径、线程数、断点位置等),然后调用相应的方法开始传输操作。 总之,多线程断点续传工具类是提高大文件传输效率和可靠性的有效手段,它结合了...

    java多线程处理数据库数据

    然而,为了更好地管理和控制线程,Java并发包提供了如`ExecutorService`、`Future`、`Callable`等高级接口和类,它们简化了多线程编程,并提供了更好的资源管理。 在处理数据库数据时,我们通常会使用JDBC(Java ...

    java多线程分页查询

    针对数据量较大的场景,本文介绍的多线程分页查询方案主要包含以下几个步骤: - **步骤1:计算总记录数**。首先通过执行一个统计查询语句获取总的记录数,为后续的分页提供依据。 - **步骤2:设置页面信息**。根据...

    JAVAJAVA多线程教学演示系统论文

    这篇论文的核心内容可能包括以下几个方面: 1. **多线程基础**:论文可能会首先介绍多线程的基本概念,解释为什么在JAVA中需要使用多线程,以及多线程如何提升程序的执行效率。这部分内容可能会涉及到线程的创建、...

    Java多线程编程

    **并发工具类**:Java并发包(`java.util.concurrent`)提供了一系列高级并发工具,如`Semaphore`(信号量)、`CyclicBarrier`(循环屏障)、`CountDownLatch`(倒计时器)和`ExecutorService`等,它们可以帮助开发者...

    JAVA100例之实例64 JAVA线程间通讯

    在"JAVA100例之实例64 JAVA线程间通讯"这个主题中,我们将深入探讨Java中实现线程间通信的几种主要方法。 1. **共享数据**:最直观的线程间通信方式是通过共享内存空间,即共享变量。只要对共享变量的操作是线程...

    java多线程下载工具,仿照迅雷

    在实现这样的工具时,我们需要理解并掌握以下几个关键知识点: 1. **线程与并发**:Java中的多线程是通过`Thread`类或`Runnable`接口来创建和管理的。在下载任务中,每个线程负责下载文件的一部分,多个线程同时...

    java多线程几个概念

    ### Java多线程几个核心概念 #### 一、理解多线程 多线程是一种让程序内部的不同任务或计算能够并发执行的技术。在Java中,多线程的应用极为广泛,可以大大提高程序的效率和响应性。多线程的核心概念包括以下几个...

    JAVA多线程的一个带UI界面的例子

    3. **线程通信**:在多线程环境下,线程间需要进行通信,例如,通过`wait()`, `notify()`, `notifyAll()`方法来协调线程的执行顺序,或者使用`BlockingQueue`等并发工具类实现线程间的同步。 4. **线程优先级**:...

    java基础多线程练习题(1)

    2. 继承`Thread`类:直接创建一个类继承`Thread`,覆盖`run()`方法。创建该类的实例并调用`start()`方法启动线程。 ```java class MyThread extends Thread { public void run() { // 线程执行的代码 } } ...

    java 多线程交互简单范例

    这个压缩包中的文件提供了几个关于Java多线程交互的实例,可以帮助我们深入理解如何在并发环境中控制线程的同步,确保数据的一致性和安全性。 首先,让我们讨论一下标题和描述中提到的关键概念——“多线程交互”和...

    java线程入门,一本简绍java线程的书

    书中可能涵盖了以下几个核心知识点: 1. **线程的概念与分类**:介绍什么是线程,线程如何在操作系统中运行,以及Java中线程的两种创建方式——通过`Thread`类的子类和实现`Runnable`接口。 2. **线程的状态**:...

    几个java线程的例子

    本篇文章将详细讲解几个Java线程的实例,帮助你深入理解这一关键概念。 首先,我们需要了解Java中的线程创建方式。在Java中,有两种主要的创建线程的方式:继承`Thread`类和实现`Runnable`接口。当继承`Thread`类时...

Global site tag (gtag.js) - Google Analytics