java多執行緒

2021-08-13 21:26:44 字數 3436 閱讀 7026

1,建立乙個任務

實現runnable介面,並重寫run()方法

class

myrunnable

implements

runnable

}

2,建立執行緒

<1>建立乙個類,繼承thread類,並重寫run()方法,建立此類物件。

<2>實現runnable介面,並重寫run()方法,利用thread類的構造方法,傳入此類。

public

class

t1 }

class

myrunnable

implements

runnable

}class

mythread

extends

thread

}

3,啟動執行緒

呼叫執行緒物件的start()方法

public

class t1

}

4,同步鎖

例:

用**實現,視窗

一、視窗

二、兩個視窗同時進行買票(總共十張票)

public

class

ticketdemo

}class

mimplements

runnable

ticket--;

system.out.println(thread.currentthread().getname()+

"售出第" + (10-ticket)+"票");

//為體現出交替買票的效果,賣出一張票之後,執行緒睡眠10毫秒,讓另乙個視窗搶到cpu執行權

try catch (interruptedexception e) }}

}

執行結果為:

下面的**使用了同步鎖

public

class

ticketdemo

}class

mimplements

runnable

ticket--;

system.out.println(thread.currentthread().getname()+

"售出第" + (10-ticket)+"票");

}//在此地方釋放唯一鎖

//為體現出交替買票的效果,賣出一張票之後,執行緒睡眠10毫秒,讓另乙個視窗搶到cpu執行權

try catch (interruptedexception e) }}

}class

lock

執行結果為:

在使用同步鎖時一定要注意,鎖是否是唯一的!

5,同步方法

1,同步方法的監視器是this

2,在同乙個物件中,執行緒在呼叫同步方法的時候,其他的同步方法無法執行(因為this沒有被釋放)

6,執行緒狀態

<1>建立

(1)當new乙個thread時,執行緒就被建立了出來。

<2>就緒

(1)當執行緒呼叫start()方法後,就進入了就緒狀態,隨時準備搶奪cpu執行權

<3>阻塞

(1)在,當前執行緒呼叫thread.sleep(時間t)方法時,在時間t內,呼叫此方法所在的執行緒一直處於阻塞狀態,直到經過時間t後重新進入就緒狀態

(2)當執行緒要執行同步**塊而沒有lock的時候,進入阻塞狀態,直到拿到lock才進入執行狀態

(3)在,當前執行緒中的物件執行wait()方法時,表示進入阻塞狀態,只有當另乙個執行緒內的此物件執行notify()方法後,才被喚醒,重新進入就緒態。應當注意的是,此兩種方法是屬於object類內的。而不是thread類內。此外,這兩句**執行時,不允許可能會出現其他的執行緒進行同步執行,所以這兩句**一定要在同步**塊中執行。

當多個執行緒中的此物件都在等待時間,可以使用notifyall()方法,使之全部喚醒。

下面是乙個使用wait()方法和notify()方法的乙個小例子。

/*

* wait()方法會釋放當前鎖(wait()方法表示當前物件資源沒有準備好)

* notify()(通知當前物件資源已經準備好了)

* * 題目:

* a : 1000元

* b : 1000元

* * a -> 轉賬給b 100元

* b -> 轉賬給a 100元

* * 最後兩人仍舊剩餘1000元

* 要求:

* 必須是a先轉賬給b,然後b再轉賬給a

* 分別開啟兩個執行緒執行這兩個任務。

* * */

public

class t7

}//任務a

class ra implements runnable

@override

public

void

run()

//若a已經給了b一百元,則通知執行緒t2我已經給了b一百元了,可以往下進行了

if(b.getmoney()>1000) }}

}//任務b

class rb implements runnable

@override

public

void

run() catch (interruptedexception e) }}

synchronized (a)

}}//乙個銀行賬戶類

class rank

public string getid()

public

void

setid(string id)

public

float

getmoney()

public

void

setmoney(float money)

}

(5)當執行join()方法時,會讓當前呼叫此方法的執行緒進入執行狀態,若是沒有指定執行時間,則在當前執行緒執行完(進入死亡狀態後)其他執行緒才能夠繼續搶奪cpu執行權。

(6)同樣,既然有強制插入執行緒的方法,自然也有強制禮讓執行緒的方法。yield()方法,會使得執行此方法的當前執行緒進入就緒狀態,但值得注意的是,禮讓出來的cpu執行權只會被那些優先順序與當前執行緒相同,或者比當前執行緒更加高的執行緒搶奪到。

<4>執行

<5>死亡

1,如果在同步**塊中執行yield()方法會造成什麼結果?

2,如果乙個執行緒沒有wait()的話,notify會造成什麼結果?

java多執行緒

在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...

Java 多執行緒

1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...

JAVA 多執行緒

為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...