java 多线程 四个窗口卖100张票,遇到的一些问题

问题一:启用了四个线程,但是只有一个窗口在卖票。

public class IOTest {

	public static void main(String[] args) {
		
		TicketSell t1 = new TicketSell();
		TicketSell t2 = new TicketSell();
		TicketSell t3 = new TicketSell();
		TicketSell t4 = new TicketSell();
		
		t1.setName("第一号窗口");
		t2.setName("第二号窗口");
		t3.setName("第三号窗口");
		t4.setName("第四号窗口");

		t1.start();
		t2.start();
		t3.start();
		t4.start();


	}

}

class TicketSell extends Thread{
	
	private static int ticket = 100;
	
	@Override
	public void run() {
		
		//在循环开始外围进行同步代码块,当第一个线程进入的时候,因为一直在循环所以代码没有执行完
		//其他的线程不能执行该同步代码块的代码
		synchronized (TicketSell.class) {
			while(ticket>0){
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(this.getName()+"卖出第 "+ticket +"号票");
				ticket--;
			}
		}
	}
}

在循环开始外围进行同步代码块,当第一个线程进入的时候,因为一直在循环所以代码没有执行完,其他的线程不能执行该同步代码块的代码。
所以,在写同步代码块的时候,注意不要把循环也包含在内。
对代码进行修改:

class TicketSell extends Thread{
	
	private static int ticket = 100;
	
	@Override
	public void run() {
		
			while(ticket>0){
			synchronized (TicketSell.class) {
				try {
					Thread.sleep(10);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(this.getName()+"卖出第 "+ticket +"号票");
				ticket--;
			}
		}
	}
}

1号线程和4号线程,满足ticket>0,会进入while循环,但是此刻其他线程正在执行同步代码块,带其执行完后, 1号线程和4号线程会分别执行同步代码块。

再次进行修改
 

class TicketSell extends Thread{
	
	private static int ticket = 100;
	
	@Override
	public void run() {
		
			while(true){
			synchronized (TicketSell.class) {
				
				if(ticket>0){
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(this.getName()+"卖出第 "+ticket +"号票");
					ticket--;
				}else{
					break;
				}
			}
		}
	}
}

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值