Java-多線程基本

來源:互聯網
上載者:User

標籤:多線程   java   

Java-多線程基本
一 相關的概念
進程:是一個正在執行中的程式
每一個進程都有一個執行的順序,該順序是一個執行路徑,或者叫一個控制單元

線程:就是進程中的一個獨立的控制單元,線程在控制著進程的執行

注意 :
一個進程至少有一個線程

Java VM啟動的時候會有一個進程java.exe
該進程中至少一個線程負責java程式的執行,而且這個線程啟動並執行代碼在main方法中
該線程稱為主線程

JVM啟動不止一個線程,還有負責記憶體回收機制的線程

二 自訂建立線程
需要用到Thread類
建立方法一
1.定義類繼承自Thread

2.複寫Thread中的run方法

3.調用線程的start方法,該方法有兩個作用:啟動線程,調用run方法

建立方法二:
1.定義類實現Runnable介面

2.覆蓋Runnable介面中的run方法

3.通過Thread類建立線程對象

4.將Runnable介面的子類對象作為實際參數傳遞給Thread類的建構函式:
原因是自訂的run方法所屬的對象是Runnable介面的子類對象
所以要讓線程去指定對象的run方法,就必須明確run方法的所屬對象

5.調用Thread類的start方法開啟線程並調用Runnable介面子類的run方法

兩種方式的區別:
方法二實現方式的好處:避免了單繼承的局限性,建議使用實現的方式

多線程的特性:隨機性,由於cpu的分時調度規則(在某一個時刻,cpu只運行一個程式,cpu在運行過程中做著快速的切換),至於執行的時間,cpu說的算

對象調用run和start的區別:
start:開啟線程並執行該線程的run方法
run:僅僅是對象調用方法,而且線程建立了,並沒有運行

多線程的運行狀態:
建立,運行,消亡,阻塞,凍結
如:

多線程常用的方法:
static Thread currentThread()擷取當前線程對象
getName()擷取線程名稱,線程名稱預設格式為Thread-0(1,2,3…..)
setName或者建構函式可以設定線程名稱

三 多線程的安全問題:

解決線程操作資料時的時間差問題需要用到
1,同步代碼塊

synchronized(對象鎖){    需要同步的代碼;}

2,同步函數
就是將synchronized關鍵字加到函數上

public synchronized void Test(){}

如何找出線程的安全隱患:
1.明確哪些代碼是多線程運行代碼
2.明確共用的資料
3.明確多線程運行代碼中哪些語句是操作共用資料的

三 鎖
鎖:
鎖就是一個對象
同步函數的鎖死this,
靜態同步函數的鎖是該方法所在類的位元組碼檔案對象。類名.class對象:靜態方法中不可以定義this,靜態方法進入記憶體,記憶體中還沒有本類的對象
但是一定有該類對應的位元組碼檔案對象,類名.class,該對象的類型是class

死結:兩個線程相互爭奪鎖的情況

下面是一個面試題:寫一個死結的Demo

class Test implements Runnable{    private boolean flag;    Test(boolean p_flag)    {        this.flag = p_flag;    }    public void run()    {        if (flag)        {            while (true)            {                synchronized(MyLock.locka)                {                    System.out.println("if locka");                    synchronized(MyLock.lockb)                    {                        System.out.println("if lockb");                    }                }            }        }        else        {            while (true)            {                    synchronized(MyLock.lockb)                {                     System.out.println("if lockb");                                     synchronized(MyLock.locka)                         {                        System.out.println("if locka");                     }                     }            }        }    }}//鎖對象class MyLock{    static Object locka = new Object();    static Object lockb = new Object();}class TestDemo{    public static void main(String[] args)    {        Thread t1 = new Thread(new Test(true));        Thread t2 = new Thread(new Test(false));        t1.start();        t2.start();    }}

四 多線程與單例設計模式:
主要是懶漢式的問題:

class Singel {    private static Singel s = null;    private Singel();    public static Singel getInstance()    {            //雙重判斷可以解決效率低的問題        if (null == s)        {            //synchronized關鍵字比起在函數上同步更加高效            synchronized(Singel.class)//使用的本類檔案的鎖            {                if (null == s)                {                    s = new Singel();                }            }            return s;        }    }}

上面的代碼需要記住,面試可能會問到

著作權聲明:歡迎交流指本文章的錯誤,必定虛心接受,QQ872785786

Java-多線程基本

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.