標籤:量化 ide over end 思想 interrupt extend sys 調用
多線程其實在作業系統已經深入瞭解過,現在就不做學習概念,其實理解線程很簡單,首先進程就是一種正在核心態啟動並執行軟體,而線程就是一種輕量化的進程,和進程不同的是線程一般存在於一個進程中,共用地址空間。具體的可以參考作業系統的課程。
那麼java程式的運行原理及JVM的啟動是多線程的嗎?
A:Java命令去啟動JVM,JVM會啟動一個進程,該進程會啟動一個主線程。
B:JVM的啟動是多線程的,因為它最低有兩個線程啟動了,主線程和記憶體回收線程。
多線程的實現由三種方法
第一種
繼承Thread類並重寫run方法
public Class A extends Thread{
@Override
public void run(){
}
}
注意使用的時候,我們不直接調用run方法,而是使用start啟動線程。
A a=new A();
a.start //不是a.run
介紹幾個線程中的方法,首先是擷取名字:getName()//擷取當前進程的名字。更改名字的方法 A a=new A(“thread_1”)
那麼思考一個問題如果是其他的線程我們想擷取名字但是並沒有調用Thread類,比如我想要查看主線程的方法,使用getName,它會報錯,因為主函數並不是Thread,此時有一個方法是,Thread currentThread() 方法可以返回一個Thread類型的參數,所以我們可以Thread currentThread().getName()。還有一個方法是優先順序,關於調度的知識在作業系統和機組中都有說明。getPriority()擷取當前線程的優先順序。setPriority()設定優先順序(最高為10,最低為1)。join(),它的作用是讓某個線程執行完畢再
去執行其它線程。中斷線程 interrupt(),它可以使線程中斷,並返回一個InterruptedExpection類型,則收到這個錯誤之後,在類中的try catch中,catch收到錯誤,執行裡面的內容,然後繼續執行,這樣的好處是代碼可以通過走try catch,而繼續執行下去。還有很多類似守護線程和禮讓線程,可以自行看API瞭解。
第二種方式
實現Runnable介面
public Class A implements Runable{
@Override
public void run(){
}
}
A a=new A();
//有點和第一類不一樣了,需要建立Thread類的對象,並把上面類的對象作為參數傳遞。
Thread t1=new Thread(a,“Thread_1”);
t1.start();
那麼我們先把這兩種方法比較,為什麼需要兩種方法?原因是這樣的,因為java是單繼承的,也就是說,如果我的一個類有了父類或者以後可能需要繼承那麼我們就使用第二種方法。
需要注意的是如同在作業系統中學習的互斥區的概念,如果run中的代碼對同步性有著很大的要求,舉個例子:while(tickets>0){
System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);
}
在多線程中這樣的代碼是不安全的,比如恰好我有三個進程同時進入while中,假設此時tickets都是1,那麼此時會出現問題,第一個進程執行完了後,tickets變成0,但其他兩個進程還在while中,所以還會繼續執行,tickets變成-1.-2.那麼我們應該怎麼解決呢,這裡的思想和互斥區的思想是一樣的,我們使這段代碼只允許一個進程進入,那麼就可以解決問題了。使java提供的就是synchronized(),具體怎麼使用呢?簡單的說就是我們將需要同一時刻只允許執行一個進程的一段程式碼封裝起來。注意此時物品我們需要在代碼外面建立一個對象作為共用對像。然後加入到這個方法中。舉個例子:
Object ob=new Object();
synchronized(obj){
while(tickets>0){
System.out.println(Thread.currentThread.getName()+"正在出售第 "+tickets--);
}
}
java學習第22天(關於進程的建立及使用)