Jaヽ(′▽?zhuān)?ノva多(′?_?`)線(xiàn)程是多線(xiàn)指在一個(gè)程序中有多個(gè)線(xiàn)程同時(shí)執行,這些線(xiàn)程可以并發(fā)地訪(fǎng)問(wèn)共享資源,程中程并(bing)從而提高程序的何實(shí)執行效率,在Java中,現線(xiàn)可??以通過(guò)繼承Thread類(lèi)或實(shí)現Runnable接口來(lái)創(chuàng )建線(xiàn)程,發(fā)??庫Jav??a提供了一套豐富的多線(xiàn)線(xiàn)程并發(fā)庫,包括線(xiàn)程池、程中程并同步器、何實(shí)鎖等工具類(lèi),現線(xiàn)可以幫助開(kāi)發(fā)者更方便地實(shí)現多線(xiàn)程編程。發(fā)庫
1、繼承Thread類(lèi)
Java中的程中程并每個(gè)線(xiàn)程都是通過(guò)繼承Thread類(lèi)來(lái)實(shí)現的,創(chuàng )建一個(gè)新類(lèi),何實(shí)繼承自Thread類(lèi),??現線(xiàn)然后重寫(xiě)run()方法,ヽ(′▽?zhuān)?ノ發(fā)庫在run()方法中編寫(xiě)線(xiàn)程(′?_?`)要執行的任務(wù),創(chuàng )建該類(lèi)的對象,并調用start()方法啟動(dòng)線(xiàn)程。
class My??Thr(′ω`*)ead exteヽ(′?`)ノnds Thread { @Override public void run() { // 線(xiàn)程要執行的任務(wù) }}public class Main { public?? static void main(String[] args) { MyThread myThread = new MyThread(); myThread.ヽ(′ー`)ノstart(); }}2、實(shí)現Runnable接口
另一種創(chuàng )建線(xiàn)程的方法是實(shí)現Runnable接口,創(chuàng )建一個(gè)新類(lèi),實(shí)現Runnable接口,然后重寫(xiě)run()方法,在run()方法中編寫(xiě)線(xiàn)程要執行的任務(wù),創(chuàng )建該類(lèi)的對象,將其作為參數傳遞給Thread類(lèi)的構造函數,然后調用start()方法啟動(dòng)線(xiàn)程。
class My(′_`)Runnable implem(′_`)ents Runnable { @Override public void run(┐(′ー`)┌) { // 線(xiàn)程要執行的任務(wù) }}public class Main { public static(?_?;) void main(String[(′?_?`)] args) { MyRunnable myRunnab(?_?;)le = new MyRunnaヾ(^-^)ノble();???(′?_?`) Thread thread = new( ?ヮ?) Thread(myRunnable); thread.start(); }}3、使用線(xiàn)程池
線(xiàn)程池是一種管理線(xiàn)程的機制,可以有效地控制(zhi)線(xiàn)程的數量(??-)?,避免過(guò)多的線(xiàn)程消耗系統資源,Java提供了Executor框架來(lái)實(shí)現線(xiàn)程池,Executor框架提供了幾種線(xiàn)程池類(lèi)型,如FixedThreadPool、CachedThreadPool、ScheduledThreadPool等,通過(guò)Executors工廠(chǎng)類(lèi)可以創(chuàng )建不同類(lèi)型的線(xiàn)程ヾ(?■_■)ノ池。
import java.util.concurre(′▽?zhuān)?)n??t.Execut??orService;import java.util.concurrent.Executo?rs;public class Main { public sta(????)tic void main(String[] args) { ExecutorService fixedThreadPool = Executors.new??FixedThreadPool(5); // 創(chuàng )建一個(gè)固定大小的線(xiàn)程池,最多允許5個(gè)線(xiàn)程同時(shí)運行 fixedThreadPool.execute(new MyRunnable()); // 將任務(wù)提交到線(xiàn)程??池執行 fixedThreadPool.shutdown(); // 關(guān)閉線(xiàn)程池,不再接受新的任務(wù),等待已提交的任務(wù)執行完畢后關(guān)閉所有線(xiàn)程 }}4、使用同步(⊙_⊙)器和鎖
同步器和鎖是Java多線(xiàn)程編程(cheng)中常用的概念,用于解決多線(xiàn)程環(huán)境下的數據不一致問(wèn)題,Java提供了synchronized關(guān)鍵字和ReentrantLock類(lèi)來(lái)實(shí)現同步,
public class Counter { pr(′ω`)ivate int count = 0; // 需要保(bao)護的共享資源 privaヾ(?■_■)ノte final Object lock = new Object((′ω`)); // 可重入鎖對象 public void incremen(′?_?`)t() { // synchronized修飾的方法或代碼塊(同理) synchronized (lock) { // 保證同一時(shí)刻只有一個(gè)線(xiàn)程能夠訪(fǎng)問(wèn)被修飾的資(′?_?`)源(這里使用了synchronized關(guān)鍵字) count++; // 對共享資源進(jìn)行操作(這里對count進(jìn)行了自增操作) } // 當synchronized代碼塊執行完(′?_?`)畢后,會(huì )自動(dòng)釋放鎖,其他線(xiàn)程可以繼續訪(fǎng)問(wèn)被保護的資源(這里使用了synchronized關(guān)鍵字) }}1、Java中ヽ(′?`)ノ的volatile關(guān)鍵字有什么作(′?ω?`)用?如何使用?
答:volatile關(guān)鍵字可以保證變量的可見(jiàn)性,即當??一個(gè)變量被volatile修飾時(shí),它會(huì )保證修改后的值立即被更新到主內存中,其他線(xiàn)程可以立即看到修改后的值,使用volatile關(guān)鍵字時(shí),需要??將它修飾在變量聲明??之前。
private volatile int count = 0; // 將count聲明為vol??ati(◎_◎;)le類(lèi)型,以保證其可見(jiàn)性(同??理)