Java多線程基礎(chǔ)
1. 前言
這篇文章,是對(duì)Java多線程編程的基礎(chǔ)性介紹。
文章將介紹Java語言為支持多線程編程提供的一些特性。通過這篇文章,您將了解到如何通過Java語言創(chuàng)建一個(gè)線程,如何通過內(nèi)置的鎖來實(shí)現(xiàn)線程間的同步,如何在線程間進(jìn)行通信以及線程的中斷機(jī)制。
2. 什么是線程
線程是操作系統(tǒng)調(diào)度的最小單位,在一個(gè)進(jìn)程中,一般至少有一個(gè)線程在運(yùn)行。一個(gè)進(jìn)程中包含的多個(gè)線程,在多核處理器中,操作系統(tǒng)可以將多個(gè)線程調(diào)度到不同的CPU核心上運(yùn)行,多個(gè)線程可以并行運(yùn)行。
在同一個(gè)進(jìn)程中的多個(gè)線程,共享同一個(gè)進(jìn)程空間,這意味著,線程間通信的成本相對(duì)進(jìn)程間會(huì)低很多,但是由于可以同時(shí)訪問同一個(gè)內(nèi)存地址,所以不正確的同步可能會(huì)導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)而發(fā)生錯(cuò)誤。
3. 創(chuàng)建一個(gè)線程
在Java中,創(chuàng)建一個(gè)線程最簡(jiǎn)單的方式是繼承 java.lang.Thread 類。通過重寫Thread類的run()方法,可以將線程中需要執(zhí)行的代碼放到run()方法中,這樣,當(dāng)這個(gè)線程被啟動(dòng)以后,可以在新啟動(dòng)的線程中執(zhí)行這些邏輯。
View Code
上面的代碼中,我們通過繼承Thread創(chuàng)建了一個(gè)SimpleThread類,然后重寫了Thread的run()方法,把需要在新的線程中執(zhí)行的邏輯放到run()方法中,當(dāng)通過Thread的start()方法啟動(dòng)線程以后,run()方法就會(huì)在新線程中被執(zhí)行。
如果采用這種方式創(chuàng)建線程,那么當(dāng)我們有多個(gè)不同的邏輯需要并行執(zhí)行,那么我們需要像上面一樣,通過繼承的方式創(chuàng)建多個(gè)Thread的子類,然后重寫run()方法來實(shí)現(xiàn)。這樣看來,我們其實(shí)是創(chuàng)建了多個(gè)不同類型的線程,然后啟動(dòng)它們。
除了采用繼承Thread類型,重新run()方法來創(chuàng)建線程,java還提供了一個(gè)java.lang.Runnable接口來"創(chuàng)建"多線程。準(zhǔn)確的說,Runnable接口并沒有創(chuàng)建一個(gè)線程,而是通過實(shí)現(xiàn)Runnable接口,我們可以定義一個(gè)可以被線程執(zhí)行的任務(wù)。
<