博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程卖票
阅读量:2169 次
发布时间:2019-05-01

本文共 2193 字,大约阅读时间需要 7 分钟。

简单实现(synchronized)

/** * 卖票 企业级套路 + 模板 *    1. 在高内聚低耦合的前提下:  线程     操作(对外暴露的调用方法)     资源类 *     高内聚: 资源类对外暴露的功能只在自己身上实现 低耦合: 调用者和   资源类之间并无关系 */public class SaleTicket {	public static void main(String[] args) {		// 资源类		Ticket ticket = new Ticket();				// 线程  Thread(Runnable target, String ThreadName)		new Thread(new Runnable() {			@Override			public void run() {				for (int i = 0; i <= 30 ; i++) {					ticket.saleTicket();				}			}		}, "售票员A").start();		new Thread(new Runnable() {					@Override					public void run() {						for (int i = 0; i <= 30 ; i++) {							ticket.saleTicket();						}					}				}, "售票员B").start();		new Thread(new Runnable() {					@Override					public void run() {						for (int i = 0; i <= 30 ; i++) {							ticket.saleTicket();						}					}				}, "售票员C").start();	}}// 资源类class Ticket {	private int number = 30;	// 操作	public synchronized void saleTicket(){		if(number > 0) {			System.out.println(Thread.currentThread().getName() + "\t卖出第" + (number--) + "\t 还剩下:" + number);		}	}}

juc优化卖票

进一步优化锁的粒度

class Ticket {	private int number = 30;	private Lock lock = new ReentrantLock();// 可重入锁	// 操作	public void saleTicket(){		lock.lock();		try {			if(number > 0) {				System.out.println(Thread.currentThread().getName() + "\t卖出第" + (number--) + "\t 还剩下:" + number);			}		}finally {			lock.unlock();		}	}}

 

/** * 卖票 企业级套路 + 模板 *    1. 在高内聚低耦合的前提下:  线程     操作(对外暴露的调用方法)     资源类 *     高内聚: 资源类对外暴露的功能只在自己身上实现 低耦合: 调用者和   资源类之间并无关系 */public class SaleTicket {	public static void main(String[] args) {		// 资源类		Ticket ticket = new Ticket();		// 线程  Thread(Runnable target, String ThreadName)		new Thread(() -> { for (int i = 0; i <= 30 ; i++) ticket.saleTicket(); }, "售票员A").start();		new Thread(() -> { for (int i = 0; i <= 30 ; i++) ticket.saleTicket(); }, "售票员B").start();		new Thread(() -> { for (int i = 0; i <= 30 ; i++) ticket.saleTicket(); }, "售票员C").start();	}}// 资源类class Ticket {	private int number = 30;	private Lock lock = new ReentrantLock();// 可重入锁	// 操作	public void saleTicket(){		lock.lock();		try {			if(number > 0) {				System.out.println(Thread.currentThread().getName() + "\t卖出第" + (number--) + "\t 还剩下:" + number);			}		}finally {			lock.unlock();		}	}}

 

转载地址:http://hhxzb.baihongyu.com/

你可能感兴趣的文章
div标签布局的使用
查看>>
HTML中表格的使用
查看>>
(模板 重要)Tarjan算法解决LCA问题(PAT 1151 LCA in a Binary Tree)
查看>>
(PAT 1154) Vertex Coloring (图的广度优先遍历)
查看>>
(PAT 1115) Counting Nodes in a BST (二叉查找树-统计指定层元素个数)
查看>>
(PAT 1143) Lowest Common Ancestor (二叉查找树的LCA)
查看>>
(PAT 1061) Dating (字符串处理)
查看>>
(PAT 1118) Birds in Forest (并查集)
查看>>
数据结构 拓扑排序
查看>>
(PAT 1040) Longest Symmetric String (DP-最长回文子串)
查看>>
(PAT 1145) Hashing - Average Search Time (哈希表冲突处理)
查看>>
(1129) Recommendation System 排序
查看>>
PAT1090 Highest Price in Supply Chain 树DFS
查看>>
(PAT 1096) Consecutive Factors (质因子分解)
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>