第一题: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);
}
}
}