多線程
多線程概述:進(jìn)程,線程搂捧。
進(jìn)程:正在運行的程序驮俗。是系統(tǒng)進(jìn)行資源分配和調(diào)用的獨立單位。每一個進(jìn)程都有它自己的內(nèi)存空間和系統(tǒng)資源
多進(jìn)程有什么意義:單進(jìn)程計算機只能做一個事情允跑,一邊玩游戲和聽音樂
線程:是程序的執(zhí)行單元王凑,執(zhí)行路徑提佣。是程序使用CPU的基本單位;
多線程有什么意義
不是提高程序的執(zhí)行速度荤崇。其實是為了提高應(yīng)用程序的使用率拌屏,線程的執(zhí)行有隨機性
并行和并發(fā):前者邏輯上同時發(fā)生,指某一個時間斷內(nèi)同時運行多個程序术荤;
? ? ? ? ? ? ? ? ? ? ? ? 后者 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?點 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?倚喂。
Java程序運行原理:由java命名啟動JVM,JVM啟動就相當(dāng)于啟動一個進(jìn)程瓣戚,接著有該進(jìn)程創(chuàng)建了一個主線程去調(diào)用main方法端圈。
多線程實現(xiàn):
方式1:繼承Thread類
步驟
A:自定義類MyThread繼承Thread類
B:MyThread類里面重寫run()
C:創(chuàng)建對象
d:啟動線程
d:啟動方式調(diào)用start()方法:啟動+運行一次run()有且只能調(diào)用一次。
獲取線程名稱:
public final String getName();
設(shè)置線程名稱:
public final void setName(String name); PS:跟自定義類一樣
獲取當(dāng)前線程名稱:
public ststic Thread currentThread();
Thread currentThread.getname();
線程調(diào)度:分時調(diào)度(平分時間)子库,搶占式調(diào)度模型(按優(yōu)先級)舱权。
Java用搶占式:
public final int getPriority();返回線程優(yōu)先級:
注意:默認(rèn)優(yōu)先級5
設(shè)置優(yōu)先級:
public final void setPriority():修改優(yōu)先級
優(yōu)先級范圍1-10;越大越好幾率越高
線程休眠:
public static void sleep(long millis)暫停millis毫秒
線程假如:
public final void join()等待該線程終止
線程暫停:
public static void yield():暫停當(dāng)前執(zhí)行的線程對象仑嗅,并執(zhí)行其他線程宴倍,讓執(zhí)行看起來很和諧
后臺線程:
public final void setDeamon(boolean on)設(shè)置守護(hù)線程,該線程走完其他線程都結(jié)束仓技,必須在啟動前調(diào)用(死前可以板倆下)
中斷線程:
public final void stop()讓線程停止鸵贬,過時了
public void interrupt()中斷線程,把線程狀態(tài)終止并拋出一個InterruptedException.
線程生命周期:
新建--就緒--運行--死亡
阻塞--就緒--運行--死亡
多線程實現(xiàn)方案2:實現(xiàn)Runnable接口
步驟: A:自定義MyRunnable師兄Runnable接口
B:重寫run方法
C:創(chuàng)建MyRunnable類的對象
D:創(chuàng)建Thread類的對象脖捻,并把C步驟的對象作為構(gòu)造參數(shù)傳遞
解決單繼承的局限性阔逼,適合多個相同程序的代碼去處理同一個資源的情況,把線程同程序的代碼地沮,數(shù)據(jù)有效分離嗜浮,較好的提醒了面向?qū)ο蟮乃枷?/p>
同步代碼塊:
synchronized(對象){
需要同步的代碼
}
另一個鎖:Lock(接口)
獲取鎖:
public void lock()
釋放鎖:
public void unlock()
實現(xiàn)類ReentrantLock;
死鎖問題:
同步:效率低,嵌套時候容易產(chǎn)生死鎖
死鎖:指倆個或者倆個以上的線程在爭奪資源的過程中摩疑,發(fā)生的一種相互等待的現(xiàn)象危融。
解決:線程間通信問題:不同種類的線程間針對同一個資源的操作
生存者消費者同一把鎖
public void wait();等待
notify();喚醒單個線程
notifyAll();所有
線程組:使用ThreadGroup
public final ThreadGroup getThreadGroup();
public final String getname();
線程池:Executors工廠類.
public static ExecutService newCacherThreadPool():
FixedThreadPool(int nThreads);創(chuàng)建幾個線程
SingleThreadExecutor();
結(jié)束線程池:
shutdown();
匿名內(nèi)部類多線程使用:new Thread(){public void run(){}}.start();
了解:
定時器:定期執(zhí)行程序
Timer(定時)和TimerTask(任務(wù))類
public Timer()
public void schedule(TimeTask task,long delay)
(? ? ? ? ? ? ? ? ? ? ? ? ,long period)
cancel()