老师留的作业,模拟生产者消费者问题,写个印票-售票-买票的程序。代码如下:
问题在代码后!
//测试类
public class Ticket{
public static void main(String[]args){
TicketSeller s=new TicketSeller(10);
Producer p=new Producer("印票人员",s);
Traveler t=new Traveler("旅客",s);
p.start();
t.start();
}
}
//旅客
class Traveler extends Thread{
private String name;
private TicketSeller s;
public Traveler(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.delTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}
}
}
}
//印票
class Producer extends Thread{
private String name;
private TicketSeller s;
public Producer(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.addTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}
}
}
}
//卖票
class TicketSeller{
private int count;
private int size;
public TicketSeller(int i){
size=i;
}
public synchronized void addTicket(String n){
while(count==size){
try{
this.wait();
System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count++;
System.out.println(n+" 开始印票 剩余票数为 "+count);
}
public synchronized void delTicket(String n){
while(count==0){
try{
this.wait();
System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count--;
System.out.println(n+" 买票 剩余票数为 "+count);
}
}结果可能出现如下情况:
1.
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
2.
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
请问如何解决上述2种情况
问题在代码后!
//测试类
public class Ticket{
public static void main(String[]args){
TicketSeller s=new TicketSeller(10);
Producer p=new Producer("印票人员",s);
Traveler t=new Traveler("旅客",s);
p.start();
t.start();
}
}
//旅客
class Traveler extends Thread{
private String name;
private TicketSeller s;
public Traveler(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.delTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}
}
}
}
//印票
class Producer extends Thread{
private String name;
private TicketSeller s;
public Producer(String n,TicketSeller s){
name=n;
this.s=s;
}
public void run(){
while(true){
s.addTicket(name);
try{
Thread.sleep((int)Math.random()*1);
}catch(Exception e){}
}
}
}
//卖票
class TicketSeller{
private int count;
private int size;
public TicketSeller(int i){
size=i;
}
public synchronized void addTicket(String n){
while(count==size){
try{
this.wait();
System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count++;
System.out.println(n+" 开始印票 剩余票数为 "+count);
}
public synchronized void delTicket(String n){
while(count==0){
try{
this.wait();
System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
}catch(Exception e){}
}
this.notify();
count--;
System.out.println(n+" 买票 剩余票数为 "+count);
}
}结果可能出现如下情况:
1.
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
印票人员 开始印票 剩余票数为 10
旅客 买票 剩余票数为 9
印票线程等待!~~~~~~~~~~~~~~~
2.
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
旅客 买票 剩余票数为 0
印票人员 开始印票 剩余票数为 1
旅客买票线程等待!~~~~~~~~~~~~~
请问如何解决上述2种情况
public static void main(String[] args) {
TicketSeller s = new TicketSeller(10);
Producer p = new Producer("印票人员", s);
Traveler t = new Traveler("旅客", s);
p.start();
t.start();
}
}// 旅客
class Traveler extends Thread {
private String name; private TicketSeller s; public Traveler(String n, TicketSeller s) {
name = n;
this.s = s;
} public void run() {
while (true) {
s.delTicket(name);
try {
Thread.sleep((int) (Math.random() * 1000));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}// 印票
class Producer extends Thread {
private String name; private TicketSeller s; public Producer(String n, TicketSeller s) {
name = n;
this.s = s;
} public void run() {
while (true) {
s.addTicket(name);
try {
Thread.sleep((int) (Math.random() * 1000));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}// 卖票
class TicketSeller {
private int count; private int size; public TicketSeller(int i) {
size = i;
} public synchronized void addTicket(String n) {
if (count >= size) {
try {
System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
Thread.sleep((int) (Math.random() * 1000));
} catch (Exception e) {
e.printStackTrace();
}
} else {
count++;
System.out.println(n + " 开始印票 剩余票数为 " + count);
}
} public synchronized void delTicket(String n) {
if (count <= 0) {
try {
System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
Thread.sleep((int) (Math.random() * 1000));
} catch (Exception e) {
e.printStackTrace();
}
} else {
count--;
System.out.println(n + " 买票 剩余票数为 " + count);
}
}
}
123
private int count; private int size; public TicketSeller(int i) {
size = i;
} public synchronized void addTicket(String n) {
if (count >= size) {
try {
System.out.println("印票线程等待!~~~~~~~~~~~~~~~");
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
} else {
this.notify();
count++;
System.out.println(n + " 开始印票 剩余票数为 " + count);
}
} public synchronized void delTicket(String n) {
if (count <= 0) {
try {
System.out.println("旅客买票线程等待!~~~~~~~~~~~~~");
this.wait();
} catch (Exception e) {
e.printStackTrace();
}
} else {
this.notify();
count--;
System.out.println(n + " 买票 剩余票数为 " + count);
}
}
}
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
是在生产者Producer 和消费者Traveler 的循环中.你的程序多用了循环.