Java多線程(一)基本用法

概念及優點

        進程:進程(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、守護進程

       典型的守護進程------垃圾回收線程,當進程中沒有非守護進程時,垃圾回收線程就不存在,自動銷燬。
   以上是對多線程基礎知識的學習與回顧。
發佈了144 篇原創文章 · 獲贊 116 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章