線程的常用方法
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/