Java程序設計——多線程機制課後習題答案

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("倉庫門已打開!");
		}
	}
}


運行結果
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章