1. 程式人生 > >Java併發程式設計基礎//程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行棧和程式計

Java併發程式設計基礎//程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行棧和程式計

1.實現多執行緒的兩種方式:

(1)繼承Thread類; (2)實現Runnable介面

//程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒
//執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行棧和程式計數器,執行緒切換開銷小
//多程序是指作業系統能同時執行多個任務(程式)。
//多執行緒是指在同一程式中有多個順序流在執行。

//實現多執行緒的兩種方式:(1)繼承Thread類; (2)實現Runnable介面


public class ThreadTest {

	public static void main(String[] args)
	{
		MyThread t1 = new MyThread("t1");
		MyThread t2 = new MyThread("t2");
		t1.start();
		t2.start();
		
	}
}


class MyThread extends Thread
{
	private String name;
	public MyThread(String name)
	{
		this.name = name;
	}
	@Override
	public void run()
	{
		for(int i = 0; i < 5 ; i++)
		{
			System.out.println(name + ":" + i);
			try {
				sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
}
//實現多執行緒的兩種方式:(1)繼承Tread類; (2)實現Runnable介面
//如果一個類繼承Thread,則不適合資源共享。但是如果實現了Runable介面的話,則很容易的實現資源共享。
public class ThreadTest2 {

	public static void main(String[] args)
	{
		MyThread2 t1 = new MyThread2();
		new Thread(t1).start();
		new Thread(t1).start();
		new Thread(t1).start();
	}
}


class MyThread2 implements Runnable
{
	private int tickets = 10;
	@Override
	public synchronized void run()
	{
		for(int i = 0; i < 10; i++ )
		{
			if(this.tickets > 0)
			{
				System.out.println("買票" + this.tickets-- );
			}
		}
	}
	
}

2. 常用函式

(1)獲取和設定執行緒的名稱

獲取:String getName( );

設定:Thread(Runnable r, String name); 或 thread.setName("name");

(2)判斷一條執行緒的存活狀態

thread.isAlive();

一條執行緒的壽命起始於start()方法,終止於離開run方法.

(3)獲取一條執行緒的執行狀態

thread.getState();

執行緒的執行狀態有:new; runnable; blocked; waiting; time_waiting; terminated

(4)獲取和設定執行緒的優先順序

獲取: int getPriority();  

設定: thread.setPriority(int priority);

使用setPriority()會影響 應用程式的可移植性

(5)獲取和設定執行緒的守護執行緒狀態

一條守護執行緒扮演非守護執行緒輔助者的角色;會在應用程式最後一條非守護執行緒消失後自動死亡,因此應用程式才能終止。

獲取:Thread的 boolean isDaemon( );

設定:Thread 的 void setDaemon(boolean isDaemon);

(6)啟動執行緒

呼叫Thread 的void start() 方法啟動與該物件關聯的執行緒。

(7)中斷執行緒

public boolean isInterrupted()

public void interrupt()

public static boolean interrupted()

isInterrupted是一個例項方法,主要用於判斷當前執行緒物件的中斷標誌位是否被標記了,如果被標記了則返回true表示當前已經被中斷,否則返回false。呼叫isInterrupted並不會清除執行緒物件的中斷標識位。

interrupt是一個例項方法,該方法用於設定當前執行緒物件的中斷標識位。

interrupted是一個靜態的方法,用於返回當前執行緒是否被中斷。該方法用於判斷當前執行緒是否被中斷,並且該方法呼叫結束的時候會清空中斷標識位。

(8)中斷執行緒

void join(); 
void join(long millis); // 等待該執行緒終止的最長時間為millis毫秒 
void join(long millis, int nanos); // 等待該執行緒終止的最長時間為millis毫秒+nanos納秒

使用Thread的join()方法,join()方法會阻塞主執行緒繼續向下執行,直到子執行緒執行完畢。如果不採用join()方法的話,會先執行完main執行緒,子執行緒繼續執行。

(9)執行緒睡眠

Thread類聲明瞭一對靜態方法使執行緒睡眠(暫時性地停止執行)

void sleep(loong millis);

void sleep(long millis, int nanos);