尚学堂·Java300集·第十一章·编码题参考答案(eclipse运行结果截图+源码)

第一题:eclipse运行结果截图
在这里插入图片描述
源码:

package Homework;

/**
 * 尚学堂第十一章练习题解答
 * @author 绝尘
 *
 *一、选择题
 *  建议:将代码赋值到程序中检验。
 *	答案:
 *  1.A
 *  2.C
 *  3.AC
 *  4.C
 *  5.D
 *
 *三、编码题
 *
 *  1.5个线程同时抢购1个票源。
 *  
 */

public class SxtExercise11 {
	
	public static void main(String[] args) {
		
		WebTickets webTickets = new WebTickets(110, "12306");
		
		Buyers buyer1 = new Buyers(50, webTickets);
		Buyers buyer2 = new Buyers(50, webTickets);
		Buyers buyer3 = new Buyers(30, webTickets);
		Buyers buyer4 = new Buyers(5, webTickets);
		Buyers buyer5 = new Buyers(5, webTickets);
		new Thread(buyer1,"小王").start();
		new Thread(buyer2,"小李").start();
		new Thread(buyer3,"小周").start();
		new Thread(buyer4,"小孙").start();
		new Thread(buyer5,"小赵").start();
	}
}
class WebTickets {
	int tickets = 110;
	String name;
	public WebTickets(int tickets, String name) {
		super();
		this.tickets = tickets;
		this.name = name;
	}
}
class Buyers implements Runnable{
	int ticketsNum;
	WebTickets webTickets;
	public Buyers(int ticketsNum, WebTickets webTickets) {
		super();
		this.ticketsNum = ticketsNum;
		this.webTickets = webTickets;
	}
	public void run() {
//		如果已经没有票了,不用再去等着排队了,直接返回结束
//		这里其实是为了提升性能,避免无用的等待
		if(webTickets.tickets < this.ticketsNum) {
			System.out.println(Thread.currentThread().getName()+"-->"+this.ticketsNum
					+",余票为-->"+webTickets.tickets+",票源不足");
			return;
		}
//		模拟网络延时
		try {
			Thread.sleep(100);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		synchronized(webTickets) {//由于延时的存在,几个线程同时来到了这里等待...最后不挡住,将负数
//			票数不够,买票失败,这里主要考虑拦住最后票数马上不够时,终止其他线程的访问,否则会出现负数的票
			if(webTickets.tickets < this.ticketsNum) {
				System.out.println(Thread.currentThread().getName()+"-->"+this.ticketsNum
						+",余票为-->"+webTickets.tickets+",票源不足");
				return;
			}
//			购票成功,更新票数信息
			webTickets.tickets -= this.ticketsNum;
			System.out.println(Thread.currentThread().getName()+"-->"+this.ticketsNum
					+",余票为-->"+webTickets.tickets);
		}
	}
}

第二题:eclipse运行结果截图
在这里插入图片描述
源码:

package Homework;

/**
 * 尚学堂第十一章练习题解答
 * @author 绝尘
 *
 *一、选择题
 *  1.A
 *  2.C
 *  3.AC
 *  4.C
 *  5.D
 *
 *三、编码题
 *
 *  2.线程NumberPrinter打印数字;线程LetterPrinter打印字母。
 *  
 */

public class SxtExercise11_2 {
	
	public static void main(String[] args) {
		
		Print p = new Print();
		new NumberPrinter(p).start();
		new LetterPrinter(p).start();
		
	}
}
class Print{
	private int index = 1;
//	打印数字
	synchronized void printNumber(int i){
//		打印字母时,这里等待
		if(index%3 == 0) {
			
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
//		等待结束,开始打印数字
		System.out.print(i);
		index++;
		if(index%3 == 0) {//重要的关键性代码-->需要打印了两个数字之后才能唤醒打印字母的线程,不是每次打印完数字都要唤醒
			this.notifyAll();}
	}
	synchronized void printLetter(char c){
//		打印数字时,这里等待
		if(index%3 != 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
//		等待结束,开始打印字母
		System.out.print(c+"-");if(c == 'N') System.out.println();
		index++;
		this.notifyAll();
	}
//	打印字母
}
//打印数字线程
class NumberPrinter extends Thread{
	Print p;
	public NumberPrinter(Print p) {
		this.p = p;
	}
//	线程启动-->打印数字
	@Override
	public void run() {
		for (int i = 1; i <= 52; i++) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			p.printNumber(i);
		}
	}
}
//打印字母线程
class LetterPrinter extends Thread{
	Print p;
	public LetterPrinter(Print p) {
		this.p = p;
	}
//	线程启动-->打印字母
	@Override
	public void run() {
		for (char c = 'A'; c < 'A'+26; c++) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			p.printLetter(c);
		}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值