程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> java多線程編程(一基礎概念)

java多線程編程(一基礎概念)

編輯:JAVA編程入門知識

1、進程和線程

      進程,是一個正在運行的程序實體,windows下常見的就是xxx.exe,在任務管理器中可以看見很多個進程。它是線程的容器。

      線程,是進程中的一個執行流。在單線程編程中,我們的程序只有一個執行流:主線程的main方法。流,表明執行的過程是有順序的,如main函數中的語句需要一條一條的按順序執行,第一條語句沒執行完,就不能去執行第二條語句。

      可見,單線程編程是有限制的,那就是我們的語句只能串行執行,不可能發生某些語句同時執行的現象。有時我們希望某些代碼並行執行,就好比我們一邊吃飯,一邊看電視。這個時候,就需要使用多線程編程技術了。

      需要注意的是:一個程序至少有一個線程,那就是主線程,它對應的方法是main方法。那麼,其他線程的創建,就需要借助某一個先前已經存在的線程去創建和引發。這個先前存在的線程可以是主線程的main方法,也可以是被main創建的新的線程。

      如下圖,主線程中,運行到某個時刻,創建了(至於怎麼創建新的線程稍後會講解)新的線程thread-1,從此,CPU就比以前"忙"起來了,因為它要去執行2個線程總的代碼。真的是“同時執行”2個線程的代碼嗎?答案是否定的。CPU本身是沒有所謂的並行執行的能力的,也無所謂多線程,多線程是本機操作系統支持的。操作系統將進程線程進行管理,輪流(沒有固定的順序)分配每個進程很短的一段是時間(不一定是均分)。然後在每個線程內部,程序代碼自己處理該進程內部線程的時間分配,多個線程之間相互的切換去執行,這個切換時間也是非常短的。因此多任務、多進程、多線程都是操作系統給人的一種宏觀感受,從微觀角度看,程序的運行是異步執行的。

      我們知道就可以了,關於底層CPU到底如何做,我們並不需要關心。我們關心的是如何通過代碼去創建和操作我們的線程。我們就當我們的線程都是“並行執行的”。

 

                                                                       

 

 

 

2、調用棧

      什麼是調用棧?在以前單線程編程中,就拿main函數來說吧。以一個列子來說明。

 

public class Test  {

    
    public static int Add(int x,int y)
    {
        return x+y;
    }


    public static void main(String[] args) 
    {
        
        int x =2,y = 5;
        int re = Add(x,y);
        
        System.out.println(re);

        
    }

    
}

 

 

      操作系統調用main函數,因為main函數是程序的入口,那麼main函數就入棧了,main會占用一定的內存,因為裡面有參數args和局部變量x,y,re。當執行到Add函數調用時,這時main函數“掛起”,執行流進入Add函數,Add函數入棧,同樣系統也會為Add函數分配臨時內存空間,當Add函數執行完,Add函數出棧,返回結果,它占用的內存被回收,執行流再次回到main函數,運行到println函數,println函數入棧。。。。。println出棧,執行流再回到main,main執行完畢,程序結束,系統回收本程序的內存。

 

                                                             

 

 

注意:這裡的棧只是一個操作系統管理函數調用的模型而已,並不是數據結構中的棧,只不夠二者的邏輯結構是一致的:FILO。

        在多線程編程中,每一個線程都有自己的一個調用棧,來管理自己的函數調用。

 

 

 

3、需要記住的事項

    一、線程之間共享內存數據,這使得數據訪問更加的快捷,方便。

    二、一個使用多線程的程序,如果有任何一個線程沒有結束,那麼,這個程序就不會結束運行。

    三、JVM的線程調度模式采用了搶占式模式。搶占式調度是根據線程的優先級別來獲取CPU的使用權。但是這個也並不一定,CPU執行線程的順序由操作系統和JVM共同

           決定。但每一個線程的單次執行時間是一定的,這個時間叫時間片,在Linux系統中,默認時間片為1/100s。

           

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved