Java多線(xiàn)程基礎(chǔ)

1. 前言

  這篇文章,是對(duì)Java多線(xiàn)程編程的基礎(chǔ)性介紹。

  文章將介紹Java語(yǔ)言為支持多線(xiàn)程編程提供的一些特性。通過(guò)這篇文章,您將了解到如何通過(guò)Java語(yǔ)言創(chuàng)建一個(gè)線(xiàn)程,如何通過(guò)內(nèi)置的鎖來(lái)實(shí)現(xiàn)線(xiàn)程間的同步,如何在線(xiàn)程間進(jìn)行通信以及線(xiàn)程的中斷機(jī)制。

2. 什么是線(xiàn)程

  線(xiàn)程是操作系統(tǒng)調(diào)度的最小單位,在一個(gè)進(jìn)程中,一般至少有一個(gè)線(xiàn)程在運(yùn)行。一個(gè)進(jìn)程中包含的多個(gè)線(xiàn)程,在多核處理器中,操作系統(tǒng)可以將多個(gè)線(xiàn)程調(diào)度到不同的CPU核心上運(yùn)行,多個(gè)線(xiàn)程可以并行運(yùn)行。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn)

  在同一個(gè)進(jìn)程中的多個(gè)線(xiàn)程,共享同一個(gè)進(jìn)程空間,這意味著,線(xiàn)程間通信的成本相對(duì)進(jìn)程間會(huì)低很多,但是由于可以同時(shí)訪問(wèn)同一個(gè)內(nèi)存地址,所以不正確的同步可能會(huì)導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)而發(fā)生錯(cuò)誤。

3. 創(chuàng)建一個(gè)線(xiàn)程

  在Java中,創(chuàng)建一個(gè)線(xiàn)程最簡(jiǎn)單的方式是繼承 java.lang.Thread 類(lèi)。通過(guò)重寫(xiě)Thread類(lèi)的run()方法,可以將線(xiàn)程中需要執(zhí)行的代碼放到run()方法中,這樣,當(dāng)這個(gè)線(xiàn)程被啟動(dòng)以后,可以在新啟動(dòng)的線(xiàn)程中執(zhí)行這些邏輯。

大學(xué)生就業(yè)培訓(xùn),高中生培訓(xùn),在職人員轉(zhuǎn)行培訓(xùn),企業(yè)團(tuán)訓(xùn) View Code

  上面的代碼中,我們通過(guò)繼承Thread創(chuàng)建了一個(gè)SimpleThread類(lèi),然后重寫(xiě)了Thread的run()方法,把需要在新的線(xiàn)程中執(zhí)行的邏輯放到run()方法中,當(dāng)通過(guò)Thread的start()方法啟動(dòng)線(xiàn)程以后,run()方法就會(huì)在新線(xiàn)程中被執(zhí)行。

  如果采用這種方式創(chuàng)建線(xiàn)程,那么當(dāng)我們有多個(gè)不同的邏輯需要并行執(zhí)行,那么我們需要像上面一樣,通過(guò)繼承的方式創(chuàng)建多個(gè)Thread的子類(lèi),然后重寫(xiě)run()方法來(lái)實(shí)現(xiàn)。這樣看來(lái),我們其實(shí)是創(chuàng)建了多個(gè)不同類(lèi)型的線(xiàn)程,然后啟動(dòng)它們。

  除了采用繼承Thread類(lèi)型,重新run()方法來(lái)創(chuàng)建線(xiàn)程,java還提供了一個(gè)java.lang.Runnable接口來(lái)"創(chuàng)建"多線(xiàn)程。準(zhǔn)確的說(shuō),Runnable接口并沒(méi)有創(chuàng)建一個(gè)線(xiàn)程,而是通過(guò)實(shí)現(xiàn)Runnable接口,我們可以定義一個(gè)可以被線(xiàn)程執(zhí)行的任務(wù)。

<