1. 程式人生 > 其它 >Java執行緒常用方法詳解 Java執行緒常用方法詳解

Java執行緒常用方法詳解 Java執行緒常用方法詳解

Java執行緒常用方法詳解

 

  執行緒的常用方法

  1.start() : 執行緒呼叫該方法將啟動執行緒,使之從新建狀態進入就緒佇列排隊,一旦輪到它來享用CPU資源時,就可以脫離建立它的執行緒獨立開始自己的生命週期了。

  2.run(): Thread類的run()方法與Runnable介面中的run()方法的功能和作用相同,都用來定義執行緒物件被排程之後所執行的操作,都是系統自動呼叫而使用者程式不得引用的方法。

  3.sleep(int millsecond): 優先順序高的執行緒可以在它的run()方法中呼叫sleep方法來使自己放棄CPU資源,休眠一段時間。

  4.isAlive(): 執行緒處於“新建”狀態時,執行緒呼叫isAlive()方法返回false。線上程的run()方法結束之前,即沒有進入死亡狀態之前,執行緒呼叫isAlive()方法返回true.

  5.currentThread():該方法是Thread類中的類方法,可以用類名呼叫,該方法返回當前正在使用CPU資源的執行緒。

  6.interrupt() :一個佔有CPU資源的執行緒可以讓休眠的執行緒呼叫interrupt()方法“吵醒”自己,即導致休眠的執行緒發生InterruptedException異常,從而結束休眠,重新排隊等待CPU資源。

  執行緒同步

  在處理多執行緒問題時,我們必須注意這樣一個問題:當兩個或多個執行緒同時訪問同一個變數,並且一個執行緒需要修改這個變數。我們應對這樣的問題作出處理。

  所謂執行緒同步就是若干個執行緒都需要使用一個synchronized修飾的方法.即程式中的若干個執行緒都需要使用一個方法,而這個方法用synchronized給予了修飾。

  多個執行緒呼叫synchronized方法必須遵守同步機制:當一個執行緒使用這個方法時,其他執行緒想使用這個方法時就必須等待,直到執行緒使用完該方法。在使用多執行緒解決許多實際問題時,可能要把某些修改資料的方法用關鍵字synchronized來修飾。

  示例

  建立主類Demo45

  Bank.java

  public class Bank implements Runnable { //實現介面

  int money; //定義變數

  public void setMoney(int n) {

  money = n; //設定初始值

  }

  @Override

  public void run() { //重寫方法

  if (Thread.currentThread().getName().equals("會計")) {

  saveOrTake(300);

  } else if (Thread.currentThread().getName().equals("出納")) {

  saveOrTake(150);

  }

  }

  public synchronized void saveOrTake(int m) { //做個修飾

  if (Thread.currentThread().getName().equals("會計")) {

  for (int i = 0; i < 3; i++) { //分三次存

  money = money+m/3;

  System.out.println(Thread.currentThread().getName()+"存入"+m/3+",賬上還有"+money+",休息一會兒再存"); //列印每次存的數量

  try {

  Thread.sleep(1000); //休息1秒

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  } else if (Thread.currentThread().getName().equals("出納")) {

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

  money = money-m/3;

  System.out.println(Thread.currentThread().getName()+"取出"+m/3+",賬上還有"+money+",休息一會兒再取");

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

  Demo45.java

  public class Demo45 {

  public static void main(String[] args) {

  Bank bank = new Bank(); //建立物件

  bank.setMoney(200); //初始200塊

  System.out.println("銀行賬上還有200");

  Thread accountant = new Thread(bank); //把目標物件bank傳進去

  accountant.setName("會計");

  Thread cashier = new Thread(bank);

  cashier.setName("出納");

  accountant.start();

  cashier.start();

  }

  }

  執行結果

 

 

原文連結:http://www.maiziedu.com/wiki/java/approach/

 

  執行緒的常用方法

  1.start() : 執行緒呼叫該方法將啟動執行緒,使之從新建狀態進入就緒佇列排隊,一旦輪到它來享用CPU資源時,就可以脫離建立它的執行緒獨立開始自己的生命週期了。

  2.run(): Thread類的run()方法與Runnable介面中的run()方法的功能和作用相同,都用來定義執行緒物件被排程之後所執行的操作,都是系統自動呼叫而使用者程式不得引用的方法。

  3.sleep(int millsecond): 優先順序高的執行緒可以在它的run()方法中呼叫sleep方法來使自己放棄CPU資源,休眠一段時間。

  4.isAlive(): 執行緒處於“新建”狀態時,執行緒呼叫isAlive()方法返回false。線上程的run()方法結束之前,即沒有進入死亡狀態之前,執行緒呼叫isAlive()方法返回true.

  5.currentThread():該方法是Thread類中的類方法,可以用類名呼叫,該方法返回當前正在使用CPU資源的執行緒。

  6.interrupt() :一個佔有CPU資源的執行緒可以讓休眠的執行緒呼叫interrupt()方法“吵醒”自己,即導致休眠的執行緒發生InterruptedException異常,從而結束休眠,重新排隊等待CPU資源。

  執行緒同步

  在處理多執行緒問題時,我們必須注意這樣一個問題:當兩個或多個執行緒同時訪問同一個變數,並且一個執行緒需要修改這個變數。我們應對這樣的問題作出處理。

  所謂執行緒同步就是若干個執行緒都需要使用一個synchronized修飾的方法.即程式中的若干個執行緒都需要使用一個方法,而這個方法用synchronized給予了修飾。

  多個執行緒呼叫synchronized方法必須遵守同步機制:當一個執行緒使用這個方法時,其他執行緒想使用這個方法時就必須等待,直到執行緒使用完該方法。在使用多執行緒解決許多實際問題時,可能要把某些修改資料的方法用關鍵字synchronized來修飾。

  示例

  建立主類Demo45

  Bank.java

  public class Bank implements Runnable { //實現介面

  int money; //定義變數

  public void setMoney(int n) {

  money = n; //設定初始值

  }

  @Override

  public void run() { //重寫方法

  if (Thread.currentThread().getName().equals("會計")) {

  saveOrTake(300);

  } else if (Thread.currentThread().getName().equals("出納")) {

  saveOrTake(150);

  }

  }

  public synchronized void saveOrTake(int m) { //做個修飾

  if (Thread.currentThread().getName().equals("會計")) {

  for (int i = 0; i < 3; i++) { //分三次存

  money = money+m/3;

  System.out.println(Thread.currentThread().getName()+"存入"+m/3+",賬上還有"+money+",休息一會兒再存"); //列印每次存的數量

  try {

  Thread.sleep(1000); //休息1秒

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  } else if (Thread.currentThread().getName().equals("出納")) {

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

  money = money-m/3;

  System.out.println(Thread.currentThread().getName()+"取出"+m/3+",賬上還有"+money+",休息一會兒再取");

  try {

  Thread.sleep(1000);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  }

  }

  }

  Demo45.java

  public class Demo45 {

  public static void main(String[] args) {

  Bank bank = new Bank(); //建立物件

  bank.setMoney(200); //初始200塊

  System.out.println("銀行賬上還有200");

  Thread accountant = new Thread(bank); //把目標物件bank傳進去

  accountant.setName("會計");

  Thread cashier = new Thread(bank);

  cashier.setName("出納");

  accountant.start();

  cashier.start();

  }

  }

  執行結果

 

 

原文連結:http://www.maiziedu.com/wiki/java/approach/