Java-基礎程式設計-多執行緒

斑馬!發表於2020-12-30

目錄

一:程式,程式,執行緒

二.使用多執行緒的優點

四. Thread類的有關方法

五.執行緒的生命週期

六.執行緒的同步

七.執行緒的通訊

八:經典的生產者消費者例題


一:程式,程式,執行緒

二.使用多執行緒的優點

三:執行緒的建立和啟動

四. Thread類的有關方法

五.執行緒的生命週期

六.執行緒的同步

七.執行緒的通訊

八:經典的生產者消費者例題

 執行緒通訊的應用:經典例題:生產者/消費者問題
 生產者(Producer)將產品交給店員(Clerk),而消費者(Customer)從店員處取走產品,
 店員一次只能持有固定數量的產品(比如20),如果生產者試圖生產更多的產品,店員會叫
 生產者停一下,如果店中有空位放產品了再通知生產者繼續生產;如果店中沒有產品了,店
 員會告訴消費者等一下,如果店中有產品了再通知消費者來取走產品
 分析:
 1)是否是多執行緒問題? 是,生產者執行緒,消費者執行緒
 2)是否有共享資料?     是, 店員(或者產品)
 3)如何解決執行緒的安全問題? 同步機制,有三種方法
 4)是否涉及執行緒的通訊? 是

程式碼解決:

class Clerk{

	private int productCount = 0;
	// 生產產品
	public synchronized void produceProduct() {
		if(productCount < 20) {
			productCount++;
			System.out.println(Thread.currentThread().getName() + ":開始生產第" + productCount);
			notify();
		}else {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
    // 消費產品
	public synchronized void consumeProduct() {
		if(productCount > 0) {
			System.out.println(Thread.currentThread().getName() + ":開始消費第"+ productCount);
			productCount--;
			notify();
		}else {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}	
	}
	
}

class Producer extends Thread{
	private Clerk clerk;
	public Producer(Clerk clerk) {
		this.clerk = clerk;
	}
	@Override
	public void run() {
		System.out.println(getName()+":開始生產產品......");
		while(true) {
			try {
				Thread.sleep(10);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			clerk.produceProduct();
		}
	}
}

class Consumer extends Thread{
	private Clerk clerk;
	public Consumer(Clerk clerk) {
		this.clerk = clerk;
	}
	@Override
	public void run() {
		System.out.println(getName()+":開始消費產品......");
		while(true) {
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			clerk.consumeProduct();
		}
	}
}


public class ProductTest {
	public static void main(String[] args) {
		Clerk clerk = new Clerk();
		
		Producer p1 = new Producer(clerk);
		p1.setName("生產者1");
		Consumer c1 = new Consumer(clerk);
		c1.setName("消費者1");
		Consumer c2 = new Consumer(clerk);
		c1.setName("消費者2");
		p1.start();
		c1.start();
		c2.start();
	}
}

 

相關文章