Java程序設計——多線程機制課後習題答案
教材爲:Java程序設計精編教程(第3版)
第12章——Java多線程機制
課後習題11:
張某、李某和趙某買電影票,售票員只有三張5元的錢,電影票5元錢一張。張某拿20元一張的人民幣排在李某的前面買票,李某排在趙某的前面拿一張10元的人民幣買票,趙某拿一張5元的人民幣買票。
test11_Main.java
package test11;
public class test11_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
TicketHouse officer=new TicketHouse();
Thread Zhang,Lee,Zhao;
Zhang =new Thread(officer);
Lee=new Thread(officer);
Zhao=new Thread(officer);
Zhang.setName("張某");
Zhao.setName("趙某");
Lee.setName("李某");
Zhang.start();
Lee.start();
Zhao.start();
}
}
TicketHouse.java
package test11;
public class TicketHouse implements Runnable{
int fiveAmount=3;
int tenAmount=0;
int twentyAmount=0;
public void run()
{
if(Thread.currentThread().getName().equals("張某"))
{
saleTicket(20);
}
else if(Thread.currentThread().getName().equals("李某"))
{
saleTicket(10);
}
else if(Thread.currentThread().getName().equals("趙某"))
{
saleTicket(5);
}
}
private synchronized void saleTicket(int money)
{
if(money==20)
{
fiveAmount-=3;
twentyAmount+=1;
System.out.println(Thread.currentThread().getName()+"買票給了20元,找零15元");
}
else if(money==10)
{
while(fiveAmount<1)
{
try
{
System.out.println(Thread.currentThread().getName()+"在一邊等待....");
wait();
System.out.println("繼續買票");
}
catch(InterruptedException e) {}
}
fiveAmount-=1;
tenAmount+=1;
System.out.println(Thread.currentThread().getName()+"買票給了10元,找零5元。");
}
else if(money==5)
{
fiveAmount+=1;
System.out.println(Thread.currentThread().getName()+"買票的錢正好,給了5元,找零0元。");
}
notifyAll();
}
}
運行結果
課後習題12:
要求有三個線程:student1,student2和teacher,其中student1準備10分鐘後再開始上課,student2準備睡一小時後再開始上課。teacher在輸出三句“上課”後,吵醒休眠的線程student1;student1被吵醒後,負責再吵醒休眠的線程student2。
test12_Main.java
package test12;
public class test12_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassRoom classroom=new ClassRoom();
classroom.Teacher.setName("Tony老師");
classroom.Student1.setName("甲同學");
classroom.Student2.setName("乙同學");
classroom.Student1.start();
classroom.Student2.start();
classroom.Teacher.start();
}
}
ClassRoom.java
package test12;
public class ClassRoom implements Runnable{
Thread Student1,Student2,Teacher;
ClassRoom()
{
Teacher=new Thread(this);
Student1=new Thread(this);
Student2=new Thread(this);
}
public void run()
{
String name=Thread.currentThread().getName();
if(name.equals("甲同學"))
{
try
{
System.out.println("我是"+name+",我在上課,想睡10分鐘再開始上課");
// System.out.println("想睡10分鐘再開始上課");
Thread.sleep(1000*10*60);
}
catch(InterruptedException e)
{
System.out.println(name+"被Tony老師叫醒了");
}
Student2.interrupt();
System.out.println(name+"繼續上課");
}
else if(name.equals("乙同學"))
{
try
{
System.out.println("我是"+name+",我在上課,想睡1小時再開始上課");
//System.out.println("想睡1小時再開始上課");
Thread.sleep(1000*60*60);
}
catch(InterruptedException e)
{
System.out.println(name+"被甲同學叫醒了");
Student2.interrupt();
}
// attachThread.interrupt();
System.out.println(name+"繼續上課");
}
else if(name.equals("Tony老師"))
{
for(int i=1;i<=3;i++)
{
System.out.println("上課!");
try
{
Thread.sleep(1000);
}
catch(InterruptedException e) {}
}
// attachThread.interrupt();
Student1.interrupt();
}
}
}
運行結果
課後習題13:
要求在主線程中再創建三個線程:運貨司機、裝運工和倉庫管理員。要求線程運貨司機佔有CPU資源後立刻聯合線程裝運工,也就是讓運貨司機一直等到裝運工完成工作才能開車,而裝運工佔有CPU資源後立刻聯合線程倉庫管理員,也就是讓裝運工一直等到倉庫管理員打開倉庫才能開始搬運貨物。
test13_Main.java
package test13;
public class test13_Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Squard squard=new Squard();
squard.driver.start();
// squard.shipper.start();
// squard.stockman.start();
}
}
Squard.java
package test13;
public class Squard implements Runnable{
Thread shipper;//裝運工
Thread driver;//司機
Thread stockman;//倉庫管理員
Squard()
{
shipper=new Thread(this);
driver=new Thread(this);
stockman=new Thread(this);
shipper.setName("裝運工");
driver.setName("司機");
stockman.setName("倉庫管理員");
}
public void run()
{
if(Thread.currentThread().getName().equals("司機"))
{
System.out.println("I'm "+Thread.currentThread().getName()+",我在等裝運工完成工作才能開車...");
try
{
shipper.start();//線程開始
shipper.join();//線程聯合
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("開始開車!");
}
else if(Thread.currentThread().getName().equals("裝運工"))
{
System.out.println("I'm "+Thread.currentThread().getName()+",我在等倉庫管理員...");
try
{
stockman.start();//線程開始
stockman.join();//線程聯合
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("開始裝運貨物!");
}
else if(Thread.currentThread().getName().equals("倉庫管理員"))
{
System.out.println("I'm "+Thread.currentThread().getName()+",大家都在等我");
System.out.println("打開倉庫門需要5秒鐘,5..4...3...2...1...0");
try
{
stockman.sleep(5000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
System.out.println("倉庫門已打開!");
}
}
}
運行結果