面試的時候總是會提及到這個關於執行緒的問題。(自己根據看到的資料和自己的理解想到的,大概會有不全的地方)
說到執行緒,首先說一下程序。
①執行緒是如何建立的:
1)通過繼承thread類來實現,重寫
run方法,通過new thread()來建立執行緒的例項化物件,呼叫start()方法就可以啟動乙個執行緒
2)通過實現runnable介面是實現,重寫run方法,通過new thread(new runnable)來建立執行緒的例項化物件,呼叫start()方法啟動執行緒。
thread類實現了runnable介面。
②執行緒的狀態轉換
1)新建狀態,new例項化執行緒物件
2)就緒狀態 ,當呼叫start()方法之後,執行緒就進入就緒狀態
3)可執行狀態,這個狀態比較重要。當cpu分配資源的時候,就可以進入可執行狀態,執行run()方法。
可執行到就緒:時間片完了。或者是呼叫了yield()方法,也可以從可執行到就緒。
可執行到阻塞:呼叫sleep()方法,等待i/o。
可執行到死亡:程式在執行過程中遇到異常,呼叫stop()和destroy()方法。
sleep()和wait()方法的區別:
sleep是占用cpu資源,但是不工作,其他執行緒不能占用該cpu,os會認為該執行緒正在工作,不會讓出系統資源
wait是到等待池進行等待,讓出系統資源。
③多執行緒
多執行緒,顧名思義就是多個執行緒同時執行。
涉及到的問題有 同步、死鎖
比如執行緒a和執行緒b,要進行通訊,並且對資料結構
進行讀寫,比如鍊錶。執行緒a要對鍊錶進行讀的操作,執行緒b要對鍊錶進行寫的操作,那麼可能造成資料不安全。
應該要實現什麼呢?當執行緒a對鍊錶進行操作的時候,執行緒b不可以鍊錶進行操作,只有到執行緒a釋放了鎖之後,別的執行緒才可以進行操作
1)同步互斥:多個併發執行的執行緒在在某乙個時間段內只能有乙個執行緒對資料進行操作。
同步的方法:
1>synchronized修飾方法
2>synchronized修飾**塊
3>特殊變數域 volatile
4>threadlocal類
比如乙個例子:
火車票賣票,有兩個視窗,如何實現資料共享
package com.ljq.test;
/*** 使用runnable介面模擬4個售票視窗共同賣100張火車票的程式
* * 共享資料,4個執行緒共同賣這100張火車票
*@author jiqinlin**/
publicclass runnabletest
public static class mythread implements runnable}}
} 實際工作中,幾乎所有的多執行緒應用都用實現runnable這種方式。
看「黃宗澤」的經歷,你能想到什麼?
黃宗澤,不像大部分讀書不成 被迫 入行的年輕人,他的學業成績不算差,讀完中七,可以選擇公升學。他選擇無線。跟張柏芝拍陽光檸檬茶廣告,女主角一步登天,男配角由路人甲開始,然後轉做 節目 旅遊節目的主持,再等兩三年,角色開始有屬於自己的名字,阿強阿偉阿傑也好,總算行前一步。剛剛進入無線,感覺很無聊,沒事...
跨伺服器拷貝檔案,你能想到最快的方式是什麼?
第一種方式,很容易想到,先在源伺服器gzip進行壓縮,然後再scp到目標伺服器,最後在目標伺服器進行gunzip解壓 server1執行命令 server1 gzip c data.txt data.gz server1 scp data.gz root server2 data server2執行...
IIS日誌 能告訴你什麼?
iis是有日誌的,但是能親身去關注這個的站長並不多。有的一些站長根本沒有自己的伺服器,直接使用的是第三方公司提供的虛擬主機。iis的日誌存放在 c windows system32 logfiles資料夾,然後找乙個iis日誌分析工具就可以檢視了。同樣的道理這個,不要亂存ftp資訊。平時要注意這些檔...