线程id 获取线程名称_016 线程及初步网络编程
涉及內容:多線程的安全問題、線程的優先級、暫停線程的執行、線程同步、死鎖和死鎖的解決辦法、生產者消費者模式的實現、網絡編程三要素、IP端口及Socket的含義
1. 獲取線程基本信息的方法
(1) 獲取線程基本信息的方法有哪些?
Static Thread currentThread()返回目前正在執行的線程
Final String getName()返回線程的名稱
Final boolean isAlive判斷線程是否處于活動狀態
2. 多線程的安全性問題
(1) 多線程操作共享資源時數據的安全性問題是如何產生的?
多線程操作共享資源時,會搶占CPU的資源,如果線程在CPU給定的時間片內沒有完成一個完整的任務就被換下來的話,會造成判斷與執行結果不相符。共享資源的實時狀態沒有及時更新到線程任務中,因為線程被強行分段執行了。所以會造成數據錯亂,產生臟數據,安全性問題。
3. 暫停線程執行sleep_yield_join_stop
(1) 暫停線程執行的方法有哪些?
Final void join()調用該方法的線程強制執行,其他線程處于阻塞狀態,該線程執行完畢后,其他線程再執行。當某個線程等待另一個線程執行結束后,才繼續執行。使調用該方法的線程在此之前執行完畢,也就是等待調用該方法的線程執行完畢后再往下繼續執行。
Static void sleep(long millis)使當前正在執行的線程休眠millis毫秒,線程處于阻塞狀態。不會釋放鎖,sleep時別的線程也不可以訪問鎖定對象。
Static void yield()當前正在執行的線程暫停一次,允許其他線程執行,不阻塞,線程進入就緒狀態,如果沒有其他等待執行的線程,這個時候當前線程就會馬上恢復執行。讓出CPU的使用權,從運行狀態直接進入就緒狀態。讓CPU重新挑選哪一個線程進入運行狀態。
Final void stop() 強迫線程停止執行。已過時,不推薦使用。
(2) sleep,yield,join方法將會導致線程進入什么狀態?
Sleep 阻塞狀態;
Yield 就緒狀態;
Join 調用該方法的線程執行狀態,其他線程進入阻塞狀態。
4. 線程的優先級問題
(1) 設置和獲取線程的優先級的方法分別是什么?
Final int getPriority()獲取線程的優先級
Final void setPriority(int priority)設置線程的優先級
(2) 新創建的線程是否有優先級?線程的最高優先級及最低優先級是什么?
新創建的線程優先級是默認優先級NORM_PRIORITY:5
最高優先級MAX_PRIORITY:10
最低優先級MIN_PRIORITY:1
優先級越高越有可能先被調用執行,但是不一定。
5. 線程同步_具體實現
(1) 在Java中實現線程同步的方法有哪些?
線程同步:在一個線程執行一次任務時,對共享資源加鎖,不允許其他的線程訪問共享資源。
1-同步代碼塊
Synchornized(obj){
//其中的obj稱為同步監視器,this當前對象
同步代碼塊,指當前線程執行一次任務的代碼。
}
2-同步方法
Private synchornized void saleTicket(){
//將買票過程打包成私有方法,然后在run方法中調用
}
同步監視器只能是對象,推薦使用資源共享的對象,可以是當前對象this,也可以是其他對象。
(2) 線程同步實現的前提是什么?簡述同步方法和同步代碼塊的同步監視器?
線程同步實現的前提是多個線程訪問一個共享資源,且多個線程使用同一個鎖。要注意明確哪些代碼是多線程代碼,哪些是共享數據,哪些語句是操作共享數據的。
同步方法中沒有顯式指定同步監視器,因為同步方法的同步監視器必然是調用該方法的當前對象。同步代碼塊中要傳參指定同步監視器,一般也規定為this當前對象。
6 死鎖_死鎖的解決辦法
(1) 死鎖產生的原因是什么?
在多線程操作時,互相等待對方的資源。
(2) 如何解決死鎖問題?常用的算法有什么?
不要讓兩個對象同時持有對象鎖,采用互斥方式來解決。
銀行家算法:該算法需要檢查申請者對資源的最大需求量,如果系統現存的各類資源可以滿足申請者的請求,就滿足申請者的請求。這樣申請者就可很快完成其計算,然后釋放它占有的資源,從而保證了系統中的所有進程都能完成,所以可以避免死鎖的發生。(計算資源的大小,計算出來后,永遠按照從大到小的方式來獲得鎖)
7. 生產者消費者模式的實現_1
(1) 簡述生產者和消費者模式的原理?
生產者和消費模式,分為生產者線程類和消費者線程類。生產者線程類不斷生產商品,消費者線程類不斷取走商品,商品就是這兩類線程所共享的資源。
(2) 生產者和消費者模式會導致哪些問題的產生?
會導致數據錯亂,消費者重復取走了商品。
8. 生產者消費者模式的實現_2
(1) 線程間通信的原理是什么?
生產者線程生產完商品通知消費者線程取走商品,消費者線程取走商品后通知生產者線程開始生產商品。
(2) 線程間通信的方法有哪些?
Wait():調用了wait方法的線程進入等待池進行等待,等待池中的線程不去競爭對象鎖,直到其他的線程通知,才會進入鎖池。
Notify():隨機喚醒一個在該對象上等待的線程,被喚醒的線程進入鎖池,開始競爭該對象上的鎖
notifyAll():喚醒所有在該對象上等待的線程,優先級高的線程有可能先競爭到對象鎖
共享資源Goods類的代碼
public class Goods {
private String name; // 商品名稱
private String brand; //商品品牌
private boolean isFlag; //是否有商品,有商品時為true,生產者線程等待。無商品時為false,消費者線程等待。以次避免重復生產和重復消費的情況出現。
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public Goods(String name, String brand) {
super();
this.name = name;
this.brand = brand;
}
public Goods() {
super();
}
public synchronized void set(String brand,String name) {
if(isFlag) { //如果有商品時,生產者線程進入等待,直到消費者線程將商品取走后通知
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setBrand(brand);
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setName(name);
System.out.println("生產者線程生產了"+this.getBrand()+this.getName());
isFlag=true; //生產完商品,有了商品了,將isFlag值為true,若再分配到資源也會進行等待,不會再被調用
super.notify(); //貨備好了,通知消費者線程來取貨!!
}
public synchronized void get() {
if(!isFlag) { //如果沒貨了,無貨可取,消費者等一等
try {
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("消費者線程取走了"+this.getBrand()+this.getName());
isFlag=false; //每次取完,將代表存貨狀態的布爾值isFlag值為false,即使再被CPU選中也會進入等待狀態,不會和生產者線程搶資源和對象鎖。
super.notify(); //取完了,沒貨了,通知生產者趕緊生產!
}
}
9. 網絡編程的基本概念
(1) 網絡編程的三要素是什么?
IP地址:唯一標識網絡上的每一臺計算機,兩臺計算機之間通信的必備要素;
端口號:計算機中應用的標號(代表一個應用程序),0-1024系統使用或保留端口,端口號占2個字節,所以有效端口0-65535;編程時一般使用10000以上的端口號。
通信協議
(2) 簡述通信協議?
通信的規則 TCP(Transmission Control Protocol傳輸控制協議 ),UDP(User Datagram Protocol用戶數據電報協議)。通信協議一致的情況下要求端口號唯一。
10. IP_端口_Socket含義
(1) IP地址的分類?
IP地址用于標識網絡上的唯一一臺計算機,共32位,4個8位二進制數組成
IP地址分為:IPv4和IPv6
IPv4:“點分十進制表示法”
IPv6:“十六進制表示法”
IP地址=網絡ID+主機ID
網絡ID:標識計算機或網絡設備所有的網段;
主機ID:標識特定的主機或網絡設備
A類:8位網絡ID+24位主機ID 前八位取值范圍:1-126
B類:16位網絡ID+24位主機ID 128-191
C類:24位網絡ID+8位主機ID 192-223
D類:用于組播通信 224-239
E類:用于科研 240-255
特殊IP地址:127.0.0.1本機回環地址,用于本機測試
255.255.255.0 當前子網,一般用于當前子網廣播信息
(2) 簡述Socket的含義?
Socket稱為“套接字”,是計算機之間通信的一種約定或一種方式,通過Socket這種約定,一臺計算機可以接受其他計算機的數據,也可以向其他計算機發送數據。每一個客戶端都使用一個Socket對象表示,服務器端使用SeverSocket等待客戶端的連接。
生活案例:如果你想寫封信發給你遠方的朋友,如何寫信、將信打包,屬于應用層。信怎么寫,怎么打包完全由我們做主。而當我們將信投入郵筒時,郵筒的那個口就是套接字,在進入套接字之后,就是傳輸層、網絡層等(郵局、公路交管或者航線等)其他層次的工作了。我們從來不會去關心信是如何從西安發往北京的,我們只知道寫好了投入郵筒就OK了。
總結
以上是生活随笔為你收集整理的线程id 获取线程名称_016 线程及初步网络编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下拉框输入模糊查询_RazorSQL f
- 下一篇: 到另一个文件夹 复制hdfs上的文件_H