java多线程:并发包中的信号量和计数栓的编程模型

简介: 一:信号量的编程模型 1 package com.yeepay.sxf.test.atomic.test; 2 3 import java.util.concurrent.Semaphore; 4 5 /** 6 * 测试信号量 7 * 相当于有一把可以控制并发量的锁。

一:信号量的编程模型

 1 package com.yeepay.sxf.test.atomic.test;
 2 
 3 import java.util.concurrent.Semaphore;
 4 
 5 /**
 6  * 测试信号量
 7  * 相当于有一把可以控制并发量的锁。
 8  * 例如银行柜台,只有两个窗口。但三个人做业务,只允许同时有两个人能进行做业务
 9  * 
10  * 多线程
11  * @author sxf
12  *
13  */
14 public class TestSemaphore {
15     
16     public static void main(String[] args) {
17         //声明两个信号量
18         Semaphore semaphore=new Semaphore(2);
19         //有三个线程抢许可证(信号量)做业务
20         Person person1=new Person("sxf", semaphore);
21         Person person2=new Person("sxs", semaphore);
22         Person person3=new Person("ssy", semaphore);
23         //启动这三个线程工作(同时允许的并发量为2)
24         person1.start();
25         person2.start();
26         person3.start();
27     }
28 
29 }
30 
31 class Person extends Thread{
32     
33     /**
34      * 信号量(许可证)
35      */
36     private Semaphore semaphore;
37     /**
38      * 当前线程的名字
39      */
40     private String cname;
41     
42     public Person(String cname,Semaphore semaphore) {
43         this.cname=cname;
44         this.semaphore=semaphore;
45     }
46     
47 
48     @Override
49     public void run() {
50         System.out.println("Person.run(==>)"+getCname()+" is wating........");
51         try {
52             //获取许可证
53             semaphore.acquire();
54             System.out.println("Person.run()"+getCname()+" is doneing.......");
55             Thread.sleep(3000);
56             System.out.println("Person.run(==>)"+getCname()+"  is service done......");
57             //释放许可证
58             semaphore.release();
59         } catch (InterruptedException e) {
60             e.printStackTrace();
61         }
62     }
63 
64 
65     public Semaphore getSemaphore() {
66         return semaphore;
67     }
68 
69 
70     public void setSemaphore(Semaphore semaphore) {
71         this.semaphore = semaphore;
72     }
73 
74 
75     public String getCname() {
76         return cname;
77     }
78 
79 
80     public void setCname(String cname) {
81         this.cname = cname;
82     }
83 
84 
85     
86 
87 
88 
89 
90     
91     
92     
93 }
View Code

一:计数栓的编程模型

 1 package com.yeepay.sxf.test.atomic.test;
 2 
 3 import java.util.concurrent.CountDownLatch;
 4 /**
 5  * 测试记数栓
 6  * 
 7  * 当记数栓定义的多个事件发生时候,才能执行任务
 8  * @author sxf
 9  *
10  */
11 public class TestCountDowanLatch {
12 
13     public static void main(String[] args) throws InterruptedException {
14         //定义三个事件的计数栓
15         CountDownLatch countDownLatch=new CountDownLatch(3);
16         //定义任务线程
17         Runer runer=new Runer("sxf", countDownLatch);
18         Runer runer2=new Runer("sxs", countDownLatch);
19         Runer runer3=new Runer("sxy", countDownLatch);
20         
21         //启动任务线程
22         runer.start();
23         runer2.start();
24         runer3.start();
25         
26         //住线程监控特定事件的发生次数
27         for(int i=0;i<3;i++){
28             Thread.sleep(3000);
29             System.out.println("TestCountDowanLatch.main(事件发生第【"+(i+1)+"】次");
30             if(i==2){
31                 System.out.println("TestCountDowanLatch.main(事件发生次数已经达标允许线程执行任务)");
32                 countDownLatch.countDown();
33             }
34             
35         }
36         
37     }
38 }
39 
40 
41 class Runer extends Thread{
42     /**
43      * 计数栓
44      */
45     private CountDownLatch countDownLatch;
46     
47     private String cname;
48     
49     public Runer(String cname,CountDownLatch countDownLatch) {
50         this.cname=cname;
51         this.countDownLatch=countDownLatch;
52     }
53 
54     @Override
55     public void run() {
56         try {
57             System.out.println("Runer.run()"+getName()+"  is await.............");
58             countDownLatch.await();
59             System.out.println("Runer.run()"+getName()+"  is doneing...........cname");
60             
61         } catch (InterruptedException e) {
62             // TODO Auto-generated catch block
63             e.printStackTrace();
64         }
65     }
66 
67     public CountDownLatch getCountDownLatch() {
68         return countDownLatch;
69     }
70 
71     public void setCountDownLatch(CountDownLatch countDownLatch) {
72         this.countDownLatch = countDownLatch;
73     }
74 
75     public String getCname() {
76         return cname;
77     }
78 
79     public void setCname(String cname) {
80         this.cname = cname;
81     }
82     
83     
84     
85 }
View Code

 

相关文章
|
8天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
7天前
|
安全 算法 Java
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第11天】 在Java中,高效的并发编程是提升应用性能和响应能力的关键。本文将探讨Java并发的核心概念,包括线程安全、锁机制、线程池以及并发集合等,同时提供实用的编程技巧和最佳实践,帮助开发者在保证线程安全的前提下,优化程序性能。我们将通过分析常见的并发问题,如竞态条件、死锁,以及如何利用现代Java并发工具来避免这些问题,从而构建更加健壮和高效的多线程应用程序。
|
2天前
|
存储 安全 Java
Java中的容器,线程安全和线程不安全
Java中的容器,线程安全和线程不安全
9 1
|
3天前
|
设计模式 运维 安全
深入理解Java并发编程:线程安全与性能优化
【4月更文挑战第15天】在Java开发中,多线程编程是提升应用程序性能和响应能力的关键手段。然而,它伴随着诸多挑战,尤其是在保证线程安全的同时如何避免性能瓶颈。本文将探讨Java并发编程的核心概念,包括同步机制、锁优化、线程池使用以及并发集合等,旨在为开发者提供实用的线程安全策略和性能优化技巧。通过实例分析和最佳实践的分享,我们的目标是帮助读者构建既高效又可靠的多线程应用。
|
4天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
5天前
|
Java 程序员 编译器
Java中的线程同步与锁优化策略
【4月更文挑战第14天】在多线程编程中,线程同步是确保数据一致性和程序正确性的关键。Java提供了多种机制来实现线程同步,其中最常用的是synchronized关键字和Lock接口。本文将深入探讨Java中的线程同步问题,并分析如何通过锁优化策略提高程序性能。我们将首先介绍线程同步的基本概念,然后详细讨论synchronized和Lock的使用及优缺点,最后探讨一些锁优化技巧,如锁粗化、锁消除和读写锁等。
|
5天前
|
Java 编译器
Java并发编程中的锁优化策略
【4月更文挑战第13天】 在Java并发编程中,锁是一种常见的同步机制,用于保证多个线程之间的数据一致性。然而,不当的锁使用可能导致性能下降,甚至死锁。本文将探讨Java并发编程中的锁优化策略,包括锁粗化、锁消除、锁降级等方法,以提高程序的执行效率。
12 4
|
6天前
|
Java
探秘jstack:解决Java应用线程问题的利器
探秘jstack:解决Java应用线程问题的利器
14 1
探秘jstack:解决Java应用线程问题的利器
|
6天前
|
Java 调度 开发者
Java 21时代的标志:虚拟线程带来的并发编程新境界
Java 21时代的标志:虚拟线程带来的并发编程新境界
14 0
|
6天前
|
存储 安全 Java
Java语法掌握:打好编程基础的关键(二)
Java语法掌握:打好编程基础的关键
40 0