1. 程式人生 > >09_1_線程的基本概念

09_1_線程的基本概念

spa pan rod throw ati 程序計數器 java extends all

09_1_線程的基本概念

1. 線程的基本概念

線程的一個程序內部的順序控制流。

線程和進程的區別

每個進程都有獨立的代碼和數據空間(進程上下文),進程間的切換會有較大的開銷。

線程可以看成是輕量級的進程,同一類線程共享代碼和數據空間,每個線程有獨立的運行棧和程序計數器(PC),線程切換的開銷小。

多進程:在程序系統中同時運行多個任務(程序)

多線程:在同一個應用程序中有多個順序流同時執行

Java的線程是通過java.lang.Thread類來實現的。

VM啟動時會有一個自主方法(public static void main() {})所定義的線程。

可以通過創建Thread的實例來創建新的線程。

每個線程都是通過某個特定Thread對象所對應的方法run()來完成其操作的,方法run()稱為線程體。

通過調用Thread類的start()方法來啟動一個線程。

1.1實現線程的兩種方式之一

TestThread1

package Test;

 

public class TestThread1 {

 

public static void main(String[] args) {

Runner1 t  = new Runner1();

new  Thread(t).start();

for (int i = 0; i < 1000; i++) {

System.out.println("Main Thread" + i);

}

}

}

class Runner1 implements Runnable {

 

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

System.out.println("Runner1 Thread" + i);

}

}

 

}

1.2實現線程的兩種方式之一

TestThread2

package Test;

 

public class TestThread2 {

 

public static void main(String[] args) {

Runner2 t  = new Runner2();

t.start();

for (int i = 0; i < 1000; i++) {

System.out.println("Main Thread" + i);

}

}

}

class Runner2 extends Thread {

 

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

System.out.println("Runner1 Thread" + i);

}

}

 

}

2. sleep方法

sleep方法

可以調用Thread的靜態方法:

public static void sleep(long millis) throws InterruptedException

使得當前線程休眠(暫時停止執行millis毫秒)

由於是靜態方法,sleep可以由類名直接調用:

Thread.sleep()

例子:

package Test;

 

import java.util.Date;

 

public class TestThread3 {

 

public static void main(String[] args) {

Runner3 t = new Runner3();

t.start();

try {

Thread.sleep(10000);

} catch (InterruptedException e) {

}

t.interrupt();

}

}

class Runner3 extends Thread {

 

@Override

public void run() {

for (int i = 0; i < 1000; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

return;

}

System.out.println("-------------" + new Date() + "---------------------");

}

}

 

}

3. 生產者消費者問題

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

class WoTou {
	int id; 
	WoTou(int id) {
		this.id = id;
	}
	public String toString() {
		return "WoTou : " + id;
	}
}

class SyncStack {
	int index = 0;
	WoTou[] arrWT = new WoTou[6];
	
	public synchronized void push(WoTou wt) {
		while(index == arrWT.length) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();		
		arrWT[index] = wt;
		index ++;
	}
	
	public synchronized WoTou pop() {
		while(index == 0) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		this.notifyAll();
		index--;
		return arrWT[index];
	}
}

class Producer implements Runnable {
	SyncStack ss = null;
	Producer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = new WoTou(i);
			ss.push(wt);
System.out.println("生產了:" + wt);
			try {
				Thread.sleep((int)(Math.random() * 200));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

class Consumer implements Runnable {
	SyncStack ss = null;
	Consumer(SyncStack ss) {
		this.ss = ss;
	}
	
	public void run() {
		for(int i=0; i<20; i++) {
			WoTou wt = ss.pop();
System.out.println("消費了: " + wt);
			try {
				Thread.sleep((int)(Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}			
		}
	}
}

09_1_線程的基本概念