第十一章程式設計作業

sweetheart7-7發表於2020-11-01

1). 設計一個多執行緒的程式如下:設計一個火車售票模擬程式。假如火車站要有100張火車票要賣出,現在有5個售票點同時售票,用5個執行緒模擬這5個售票點的售票情況。

package cn.whb.test11;

public class Work1 {

	public static void main(String[] args) {
		SoleToken s = new SoleToken(100);
		new Thread(s,"視窗一").start();
		new Thread(s,"視窗二").start();
		new Thread(s,"視窗三").start();
		new Thread(s,"視窗四").start();
		new Thread(s,"視窗五").start();
	}

}

class SoleToken implements Runnable {
	
	private int tokenCount;

	
	public SoleToken(int tokenCount) {
		this.tokenCount = tokenCount;
	}

	public void run() {
		
		while(tokenCount>0) {
			SoleVotes();
		}
	}
	
	private void SoleVotes()  {
		
		if(tokenCount<=0) {
			return;
		}
		synchronized(this) {			
			if(tokenCount<=0) {
				return;
			}
			
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(Thread.currentThread().getName()+"出售了第"+(tokenCount--)+"張票");
		}
	}
}

2). 編寫兩個執行緒,一個執行緒列印1-52的整數,另一個執行緒列印字母A-Z。列印順序為12A34B56C….5152Z。即按照整數和字母的順序從小到大列印,並且每列印兩個整數後,列印一個字母,交替迴圈列印,直到列印到整數52和字母Z結束。

要求

1 . 編寫列印類Printer,宣告私有屬性index,初始值為1,用來表示是第幾次列印。

2 . 在列印類Printer中編寫列印數字的方法print(int i),3的倍數就使用wait()方法等待,否則就輸出i,使用notifyAll()進行喚醒其它執行緒。

3 . 在列印類Printer中編寫列印字母的方法print(char c),不是3的倍數就等待,否則就列印輸出字母c,使用notifyAll()進行喚醒其它執行緒。

4 . 編寫列印數字的執行緒NumberPrinter繼承Thread類,宣告私有屬性private Printer p;在構造方法中進行賦值,實現父類的run方法,呼叫Printer類中的輸出數字的方法。

5 . 編寫列印字母的執行緒LetterPrinter繼承Thread類,宣告私有屬性private Printer p;在構造方法中進行賦值,實現父類的run方法,呼叫Printer類中的輸出字母的方法。

6 . 編寫測試類Test,建立列印類物件,建立兩個執行緒類物件,啟動執行緒。

package cn.whb.test11;

public class Test {

	public static void main(String[] args) {
		Printer p = new Printer();
		
		new NumberPrinter(p).start();
		new LetterPrinter(p).start();
		
	}

}
class Printer{
	private int index=1;
	
	public synchronized void print(int i) {
		if(index%3==0) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.print(i);
		index++;
		if(index%3==0) { // 防止本來還是輸出數字,但卻把輸出字母的執行緒喚醒
			notifyAll();
		}
	}
	
	public synchronized void print(char c) {
		if(index%3!=0) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.print(c);
		index++;
		notifyAll();
	}
}

class NumberPrinter extends Thread{
	
	public NumberPrinter(Printer p) {
		this.p = p;
	}


	private Printer p;
	
	
	public void run() {
		for(int i=1;i<=52;i++) {
			p.print(i);
		}
	}
}

class LetterPrinter extends Thread{
	private Printer p;
	
	public LetterPrinter(Printer p) {
		this.p = p;
	}

	public void run() {
		for(int i=0;i<26;i++) {
			p.print((char)('A'+i));;
		}
		System.out.println();
	}
}

3). 編寫多執行緒程式,模擬多個人通過一個山洞的模擬。這個山洞每次只能通過一個人,每個人通過山洞的時間為5秒,有10個人同時準備過此山洞,顯示每次通過山洞人的姓名和順序。

package cn.whb.test11;

public class Work3 {

	public static void main(String[] args) {
		
		CrossCave cave =  new CrossCave();
		
		for(int i=1;i<=10;i++) {
			new Thread(cave,"遊客"+i).start();
		}
	}

}
class CrossCave implements Runnable{
	
	private int index=1;
	
	public void run() {
		
		cross();
	}
	
	private synchronized void cross() {
		System.out.println("第"+(index++)+"個通過山洞的人為"+Thread.currentThread().getName());
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

相關文章