package no2;
import java.util.ArrayList;
import java.util.List;
public class SealTicket {
/**
* 13、编写三各类Ticket、SealWindow、TicketSealCenter分别代表票信息、售票窗口、售票中心。售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程。(出售100张票)
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Ticket ticket = new Ticket();
TicketSealCenter tsc = new TicketSealCenter(ticket);
SealWindow sw= new SealWindow(ticket);
Thread t = new Thread(tsc);
Thread t1 = new Thread(sw);
Thread t2 = new Thread(sw );
Thread t3 = new Thread(sw );
Thread t4 = new Thread(sw );
t1.setName("一号窗口");
t2.setName("二号窗口");
t3.setName("三号窗口");
t4.setName("四号窗口");
t.start();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Ticket{
private List<Integer > list = new ArrayList<Integer>();
int tnum =0 ;
//出售
public synchronized void get() {
while(list.size()<1){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getName()+"出售第"+list.get(0)+"还有"+(list.size()-1));
if(list.get(0)>100){
list.remove(0);
return ;
}
list.remove(0);
this.notifyAll();
}
//生产
public synchronized void set() {
if(tnum >99){
return ;
}
while(list.size()>5){
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("生产第"+ ++tnum +"张票");
list.add(tnum );
this.notifyAll();
}
}
class SealWindow implements Runnable{
Ticket ticket ;
public SealWindow(Ticket t) {
super();
this.ticket = t;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
ticket.get();
}
}
}
class TicketSealCenter implements Runnable{
Ticket ticket ;
public TicketSealCenter(Ticket t) {
super();
this.ticket = t;
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
ticket.set();
}
}
}
结果:
...
...
...
一号窗口出售第96还有0
生产第97张票
四号窗口出售第97还有0
生产第98张票
一号窗口出售第98还有0
生产第99张票
生产第100张票
四号窗口出售第99还有1
四号窗口出售第100还有0
如果觉得这程序真的停下来了。。那就错了。。运行的时候你会发现你console窗口小红框没有变灰。。程序并没有真的停下来。。这里求一个可以把程序停下来的方案。。
C:\Users\Administrator.SC-201607071737\Desktop
当然没有那层
public void run() {
// TODO Auto-generated method stub
while(true){
ticket.get();
}
}倒是好办。
可以直接
if(tnum >99){
break;
};
但是代码结构就得改。。那么也不符合题目给的过程。。
来个大神把这线程停了。。; |
|