1.通过synchronized实现:
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author: 张
* @Date: 2019/2/11 13:35
* @Version: 1.0
* @Description: 1.0
*/
public class TicketThreadTest {
public static Integer TICKET_NUM_COUNT = new Integer(20);
public static class TicketWindowRunnable implements Runnable {
private int ticketNum;
public void setTicketNum(int ticketNum) {
this.ticketNum = ticketNum;
}
@Override
public void run() {
int randInt = new Random().nextInt(1000);
Long randLong = Long.valueOf(randInt);
try {
Thread.sleep(randLong);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (TICKET_NUM_COUNT) {
if (ticketNum > 0) {
if (TICKET_NUM_COUNT > 0) {
TICKET_NUM_COUNT = TICKET_NUM_COUNT - ticketNum;
System.out.println(Thread.currentThread().getName() + ":卖去" + ticketNum + "张票" + ",还剩" + TICKET_NUM_COUNT);
} else {
System.out.println("票已经卖完");
}
} else {
System.out.println("参数非法");
}
}
}
}
public static void main(String[] args){
TicketWindowRunnable ticketWindow1 = new TicketWindowRunnable();
ticketWindow1.setTicketNum(7);
TicketWindowRunnable ticketWindow2 = new TicketWindowRunnable();
ticketWindow2.setTicketNum(2);
TicketWindowRunnable ticketWindow3 = new TicketWindowRunnable();
ticketWindow3.setTicketNum(11);
new Thread(ticketWindow1,"窗口1").start();
new Thread(ticketWindow2,"窗口2").start();
new Thread(ticketWindow3,"窗口3").start();
}
}
2.通过AtomicInteger实现
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author: 张
* @Date: 2019/2/11 13:35
* @Version: 1.0
* @Description: 1.0
*/
public class TicketThreadTest {
public final static AtomicInteger TICKET_NUM_COUNT = new AtomicInteger(20);
public static class TicketWindowRunnable implements Runnable{
private int ticketNum;
public void setTicketNum(int ticketNum) {
this.ticketNum = ticketNum;
}
@Override
public void run() {
int randInt = new Random().nextInt(1000);
Long randLong = Long.valueOf(randInt);
try {
Thread.sleep(randLong);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(ticketNum > 0){
if(TICKET_NUM_COUNT.get() > 0){
TICKET_NUM_COUNT.addAndGet( -ticketNum );
System.out.println(Thread.currentThread().getName() + ":卖去" + ticketNum + "张票" + ",还剩" + TICKET_NUM_COUNT.get());
}else {
System.out.println("票已经卖完");
}
}else{
System.out.println("参数非法");
}
}
}
public static void main(String[] args){
TicketWindowRunnable ticketWindow1 = new TicketWindowRunnable();
ticketWindow1.setTicketNum(7);
TicketWindowRunnable ticketWindow2 = new TicketWindowRunnable();
ticketWindow2.setTicketNum(2);
TicketWindowRunnable ticketWindow3 = new TicketWindowRunnable();
ticketWindow3.setTicketNum(11);
new Thread(ticketWindow1,"窗口1").start();
new Thread(ticketWindow2,"窗口2").start();
new Thread(ticketWindow3,"窗口3").start();
}
}
例子来源于戳戳我