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);