概念及優點
進程:進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在當代面向線程設計的計算機結構中,進程是線程的容器。
我們在Windows任務管理器的進程中看到的exe程序,這就是我們所說的進程。如QQ;
線程:可以理解爲進程中獨立運行的子任務。比如QQ.exe運行時可以有好友視頻線程,發送表情線程。
多線程優點:可以在同一時間內運行更多的不同種類的任務。
(1)使程序的響應速度更快 ,因爲用戶界面可以在進行其它工作的同時一直處於活動狀態;
(2)當前沒有進行處理的任務時可以將處理器時間讓給其它任務;
(3)佔用大量處理時間的任務可以定期將處理器時間讓給其它任務;
(4)可以隨時停止任務;
(5)可以分別設置各個任務的優先級以優化性能。
缺點:
(1)等候使用共享資源時造成程序的運行速度變慢。這些共享資源主要是獨佔性的資源 ,如打印機等。
(2)對線程進行管理要求額外的 CPU開銷。線程的使用會給系統帶來上下文切換的額外負擔。當這種負擔超過一定程度時,多線程的特點主要表現在其缺點上,比如用獨立的線程來更新數組內每個元素。
(3)線程的死鎖。即較長時間的等待或資源競爭以及死鎖等多線程症狀。
(4)對公有變量的同時讀或寫。當多個線程需要對公有變量進行寫操作時,後一個線程往往會修改掉前一個線程存放的數據,從而使前一個線程的參數被修改;另外 ,當公用變量的讀寫操作是非原子性時,在不同的機器上,中斷時間的不確定性,會導致數據在一個線程內的操作產生錯誤,從而產生莫名其妙的錯誤,而這種錯誤是程序員無法預知的。
2、使用多線程
1)繼承Thread:Thread.java類中的start()方法通知“線程規劃期”此線程已經準備就緒,等待調用線程對象的run()方法。其實就是讓系統安排一個時間來調用Thread中的run方法,即使線程運行,啓動,具有異步的執行的效果。線程順序執行具有隨機性。
2)實現Runnable接口:由於java單繼承性,所以對於已有父類的線程類就需要實現Runnable接口的類來實現多線程。
如下方法中:
Thread(Runnable target);//分配Thread新對象
Thread(Runnable target,String name);
//代碼示例
Runnable runnable= new MyRunnable();
Thread thread= new Thread(runnable);
thread.start();
同時Thread.java類也實現了Runnable接口
3)實例變量與線程安全:不共享數據時,多個線程會獨自運行數據;共享變量時:多個線程共享一個資源,會出現非線程安全問題。可以通過synchronized給對象或方法加鎖(互斥區),來避免值被更改,值不同步的情況。
3、currentThread()方法
返回代碼段正在被那個線程調用的信息。如Thread.currentThread().getName();
this與currentThread()的區別
4、isAlive()方法
判斷當前的線程是否出於活動狀態。即線程已經啓動且尚未終止。
5、sleep()方法
指定毫秒內讓當前“正在執行的線程”休眠。
6、getId()方法
取得線程的唯一標識。
7、停止線程
3種方法:1、退出標誌,使線程正常退出,run()方法完成後線程終止。2、stop()強制終止線程,由於其安全性以及數據不同步等原因,作廢。 3、使用interrupt()方法中斷線程。
其中,interrupt不可以立即終止線程;判斷線程是否終止interrupted()(執行後具有將狀態標識置清除)和isInterrupted()(不能清除狀態標誌);
另外可以使用異常發終止狀態,即用try...catch 攔截錯誤信息。(推薦使用,可以對異常信息進行相關的處理);
在沉睡時終止:在sleep狀態下停止某一線程,會進入catch語句,並且清除停止狀態值。使之成爲false;
能停止的線程---暴力停止:stop()會拋出java.lang.ThreadDeath異常,同時釋放鎖導致數據不一致;
return也可以停止線程,
8、暫停線程
suspend與resume,該方法極易造成公共的同步對象的獨佔,,是其他線程無法訪問公共同步對象;不同步性,由於現成的暫停使數據不能同步;
9、yield方法
放棄當前的CPU資源,將它讓給其他的任務去佔用CPU執行時間。
10、線程的優先級
線程的優先級具有繼承性,優先級高的線程得到的CPU資源較多,優先級高的線程先執行完。優先級具有隨機性(針對於優先級比較接近的線程);優先級高的線程運行的快。
11、守護進程
典型的守護進程------垃圾回收線程,當進程中沒有非守護進程時,垃圾回收線程就不存在,自動銷燬。
以上是對多線程基礎知識的學習與回顧。