四个窗口卖票
第一种方法:单线程实现(每个窗口都有100张票互不干扰)
流程图
代码实现
第一种创建线程方法:继承Thread类,重写run方法
public class WinTicket extends Thread{
public WinTicket(String name){
super(name);
}
public WinTicket(){
}
//票
private int ticket=100;
@Override
public void run() {
while(true){
if(ticket<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
ticket--;
}
}
}
测试代码
public class TestWinTicket {
public static void main(String[] args) {
//1创建四个窗口
WinTicket w1=new WinTicket("窗口1");
WinTicket w2=new WinTicket("窗口2");
WinTicket w3=new WinTicket("窗口3");
WinTicket w4=new WinTicket("窗口4");
//2启动线程
w1.start();
w2.start();
w3.start();
w4.start();
}
}
第二种创建线程方法:实现Runnable接口,重写run方法
public class Ticket implements Runnable {
private int ticket=100;
@Override
public void run() {
while(true){
if(ticket<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
ticket--;
}
}
}
测试代码
public class TestTicket2 {
public static void main(String[] args) {
//创建可运行对象
Runnable ticket=new Runnable() {
private int ticket=100;
@Override
public void run() {
while(true){
if(ticket<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"卖了第"+ticket+"张票");
ticket--;
}
}
};
//创建线程并启动
new Thread(ticket,"窗口1").start();
new Thread(ticket,"窗口2").start();
new Thread(ticket,"窗口3").start();
new Thread(ticket,"窗口4").start();
}
}
第二种方法:多线程实现(四个窗口一共100张票)
流程图
代码实现
因为四个窗口共同卖100张票,为了防止四个窗口互相抢票,导致同一张票被不同窗口都卖了一次,因此加入了锁,实现只有当一个线程将票卖完以后,才释放资源,下一个线程才会继续卖票。
public class Ticket implements Runnable{
private int ticket=100;
//锁:一般选择共享资源作为锁,多个线程必须使用同一个锁。
//private Object obj=new Object();
@Override
public void run() {
while(true){
//同步代码块
if(!sale()){
break;
}
}
}
//非静态方法,锁是this
//静态方法,锁是 类名.class
public synchronized boolean sale(){//this
if (ticket <= 0) {
return false;
}
System.out.println(Thread.currentThread().getName() + "卖了第" + ticket + "张票");
ticket--;
return true;
}
}
测试代码
public class TestTicket {
public static void main(String[] args) {
Ticket ticket=new Ticket();
new Thread(ticket,"窗口1").start();
new Thread(ticket,"窗口2").start();
new Thread(ticket,"窗口3").start();
new Thread(ticket,"窗口4").start();
}
}