一、要求,有100张票,要求同时在三个窗口出售
首先创建卖票的类:
package com.edu_03;
public class ShellTicket implements Runnable{
int tickets = 100;
@Override
public void run() {
while (true) {//让窗口一直处于打开的状态
if (tickets>0) {
try {
Thread.sleep(100);
/*
* 在加入休眠之后出现了重复票和0张-1张票,出现了线程安全问题
thread1进来,休眠
thread2进来,休眠
thread3进来,休眠
*/
} catch (InterruptedException e) {
e.printStackTrace();
}
//thread1醒来,输出1,然后tickets = 0;
//thread2醒来,输出0,然后tickets = -1;
//thread3醒来,输出-1,然后tickets = -2;
System.out.println(Thread.currentThread().getName()+"正在出售第"+tickets--+"票");
/*
* 1、打印这个变量的值
* 2、减一
* 3、把减一后的数据赋值给变量
*/
}
}
}
}
这是主程序:
package com.edu_03;
public class Test {
public static void main(String[] args) {
//创建对象
ShellTicket st = new ShellTicket();
//转换成线程对象
Thread thread = new Thread(st);
Thread thread2 = new Thread(st);
Thread thread3 = new Thread(st);
//给线程设置名字
thread.setName("第一个");
thread2.setName("第二个");
thread3.setName("第三个");
//开启线程
thread.start();
thread2.start();
thread3.start();
}
}
这是结果:
第三个正在出售第100票
第一个正在出售第99票
第二个正在出售第99票
第一个正在出售第98票
第三个正在出售第97票
第二个正在出售第96票
第二个正在出售第95票
第一个正在出售第94票
第三个正在出售第93票
第二个正在出售第91票
第一个正在