1. 程式人生 > >自定義執行緒 生產者消費者 join方法

自定義執行緒 生產者消費者 join方法

1.

/*
 * 1.自定義一個類實現Runnable介面
 * 2.實現Runnable介面的run方法,自定義執行緒的任務放在run方法中
 * 3.建立Runnable實現類物件
 * 4.建立Thread物件,並把Runnable的物件作為實參傳遞給,建構函式
 * 5.呼叫Thread的run方法開啟一個程序
 * */
public class RunablePractice implements Runnable
{
	int num = 50;//不用static即可
	public void run() 
	{
		while(true)
		{
			synchronized ("鎖") 
			{
				if(num>0)
				{
					System.out.println(Thread.currentThread().getName()+"賣出了第"+num--+"張票");
					try 
					{
						Thread.sleep(10);
					} 
					catch (InterruptedException e)
					{
						e.printStackTrace();
					}
				}
				else
				{
					System.out.println("賣完了");
					break;
				}
			}
		}
	}
	public static void main(String[] args) 
	{
		RunablePractice r = new RunablePractice();
		Thread t1 = new Thread(r,"視窗1");
		Thread t2 = new Thread(r,"視窗2");
		Thread t3 = new Thread(r,"視窗3");
		t1.start();
		t2.start();
		t3.start();
	}
}



執行結果:


視窗1賣出了第50張票
視窗3賣出了第49張票
視窗3賣出了第48張票
視窗2賣出了第47張票
視窗2賣出了第46張票
視窗3賣出了第45張票
視窗3賣出了第44張票
視窗1賣出了第43張票
視窗3賣出了第42張票
視窗2賣出了第41張票
視窗3賣出了第40張票
視窗3賣出了第39張票
視窗1賣出了第38張票
視窗1賣出了第37張票
視窗3賣出了第36張票
視窗3賣出了第35張票
視窗2賣出了第34張票
視窗2賣出了第33張票
視窗2賣出了第32張票
視窗3賣出了第31張票
視窗3賣出了第30張票
視窗3賣出了第29張票
視窗1賣出了第28張票
視窗3賣出了第27張票
視窗2賣出了第26張票
視窗2賣出了第25張票
視窗2賣出了第24張票
視窗2賣出了第23張票
視窗3賣出了第22張票
視窗3賣出了第21張票
視窗3賣出了第20張票
視窗1賣出了第19張票
視窗1賣出了第18張票
視窗1賣出了第17張票
視窗3賣出了第16張票
視窗3賣出了第15張票
視窗3賣出了第14張票
視窗3賣出了第13張票
視窗3賣出了第12張票
視窗2賣出了第11張票
視窗2賣出了第10張票
視窗2賣出了第9張票
視窗2賣出了第8張票
視窗2賣出了第7張票
視窗3賣出了第6張票
視窗1賣出了第5張票
視窗1賣出了第4張票
視窗1賣出了第3張票
視窗3賣出了第2張票
視窗2賣出了第1張票
賣完了
賣完了
賣完了
2.

import java.util.Random;


class Product 
{
	double price;
	String name;
	boolean flag = false;
	public Product(){}
	public Product(String name, double price)
	{
		this.name = name;
		this.price = price;
	}
}


//wait notify
//wait和notify是屬於Object物件
//必須要在同步程式碼塊或者是同步函式中才能使用
//必須由鎖物件呼叫


class Producer implements Runnable
{
	Random random = new Random();
	int a;
	Product p;
	public Producer(Product p)
	{
		this.p = p;
	}
	public void run()
	{
		while(true)
		{
			synchronized(p) 
			{
				if(p.flag==false)
				{
					a = random.nextInt(2);
					if(a==0)
					{
						p.name = "蘋果";
						p.price = 3.2;
					}
					else
					{
						p.name = "香蕉";
						p.price = 7.3;
					}
					p.flag = true;
					System.out.println("生產了一個"+p.name+",價格為:"+p.price+"....喚醒消費者....");	
					p.notify();
				}
				else
				{
					System.out.println("正在等待消費者");
					try 
					{
						p.wait();
					} 
					catch (InterruptedException e)
					{
						e.printStackTrace();
					}
				}
			}
		}
	}
}


class Consumer implements Runnable
{
	Product p;
	public Consumer(Product p)
	{
		this.p = p;
	}
	public void run() 
	{
		while(true)
		{
			synchronized(p)
			{
				if(p.flag==true)
				{
					System.out.println("消費者正在消費...");
					try 
					{
						Thread.sleep(1000);
					} 
					catch (InterruptedException e)
					{
						e.printStackTrace();
					}
					System.out.println("消費者消費了一個產品!!!....喚醒生產者.....");
					p.flag = false;
					p.notify();
				}
				else 
				{
					System.out.println("等待生產者");
					try {
						p.wait();
					} catch (InterruptedException e) {
						// TODO 自動生成的 catch 塊
						e.printStackTrace();
					}
				}
			}
		}
	}
}


public class ProducerConsumer
{
	public static void main(String[] args) 
	{
		Product t = new Product();
		Producer p = new Producer(t);
		Consumer c = new Consumer(t);
		Thread t1 = new Thread(p);
		Thread t2 = new Thread(c);
 		t1.start();
 		t2.start();
	}
}


執行結果:


生產了一個香蕉,價格為:7.3....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
等待生產者
生產了一個香蕉,價格為:7.3....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
等待生產者
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
等待生產者
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
生產了一個香蕉,價格為:7.3....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
等待生產者
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...
消費者消費了一個產品!!!....喚醒生產者.....
等待生產者
生產了一個蘋果,價格為:3.2....喚醒消費者....
正在等待消費者
消費者正在消費...


3.守護執行緒



public class HouProcess extends Thread
{
	public HouProcess(String name)
	{
		super(name);
	}
	public void run() 
	{
		for(int i = 1;i<=100;i++)
		{
			System.out.println("更新包已經下載了"+i+"%");
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("更新包下載完成,等待安裝");
	}
	public static void main(String[] args) 
	{
		HouProcess h = new HouProcess("後臺程序");
		h.setDaemon(true);//讓h執行緒成為守護執行緒
		System.out.println("是守護程序嗎? "+h.isDaemon());
		h.start();
		for(int i = 1;i<=100;i++)
		{
			System.out.println("main"+i);
		}
	}
}


是守護程序嗎? true
main1
main2
main3
main4
更新包已經下載了1%
main5
main6
main7
main8
main9
main10
main11
main12
main13
main14
main15
main16
main17
main18
main19
main20
main21
main22
main23
main24
main25
main26
main27
main28
main29
main30
main31
main32
main33
main34
main35
main36
main37
main38
main39
main40
main41
main42
main43
main44
main45
main46
main47
main48
main49
main50
main51
main52
main53
main54
main55
main56
main57
main58
main59
main60
main61
main62
main63
main64
main65
main66
main67
main68
main69
main70
main71
main72
main73
main74
main75
main76
main77
main78
main79
main80
main81
main82
main83
main84
main85
main86
main87
main88
main89
main90
main91
main92
main93
main94
main95
main96
main97
main98
main99
main100
4.



class Mom extends Thread
{
	public void run() {
		System.out.println("洗菜炒菜");
		System.out.println("沒有醬油了....");
		System.out.println("叫兒子打醬油");
		Son s = new Son();
		s.start();
		try {
			s.join();//兒子加入執行緒,老媽暫停
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("繼續炒菜");
		System.out.println("一起吃飯");
	}
}


class Son extends Thread 
{
	public void run() {
		System.out.println("兒子跑去買醬油...");
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("買回來了");
	}
}


public class Join1 {
	public static void main(String[] args) {
		Mom m = new Mom();
		m.start();
	}
}


執行結果:


洗菜炒菜
沒有醬油了....
叫兒子打醬油
兒子跑去買醬油...
買回來了
繼續炒菜
一起吃飯