一、原始方法
/**
* 题目:三个搜票员 卖出 30张票
* 多线程编程的企业级套路+模板
* 1 在高内聚低耦合的前提下,线程 操作(对外暴露的调用方法) 资源类
*/
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.saleTicket();
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.saleTicket();
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.saleTicket();
}
}
},"c").start();
}
}
//资源类
class Ticket{
private int number = 30;
public synchronized void saleTicket(){
//对外暴露的调用方法
if (number > 0) {
System.out.println(Thread.currentThread().getName()+"卖出第:"+number--+"、还剩下:"+number);
}
}
}
二、JUC方法
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.saleTicket();
}
}
},"A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; i++) {
ticket.saleTicket();
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 40; 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() + "卖出第:" + number-- + "、还剩下:" + number);
}
} finally {
lock.unlock();
}
}
}
三、Lamba表达式改进
public class SaleTicket {
public static void main(String[] args) {
Ticket ticket = new Ticket();
new Thread(()->{for (int i = 0; i < 40; i++)ticket.saleTicket();},"A").start();
new Thread(()->{for (int i = 0; i < 40; i++)ticket.saleTicket();},"B").start();
new Thread(()->{for (int i = 0; i < 40; 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() + "卖出第:" + number-- + "、还剩下:" + number);
}
} finally {
lock.unlock();
}
}
}