【Java篇】多线程详解
生活随笔
收集整理的這篇文章主要介紹了
【Java篇】多线程详解
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【Java】多線程基礎詳解
文章目錄
- 【Java】多線程基礎詳解
- 線程的相關概念
- 一、創(chuàng)建線程的幾種方式
- 1. 繼承Thread類
- 2. 實現(xiàn)Runnable接口
- 3.實現(xiàn)Callable接口
- 4. 推薦使用Runnable接口
- 二、線程安全
- 1. 線程安全問題引入
- 2.解決線程安全問題
- 3. 線程中的可見性問題:
- 運行結果顯示
- 解決方法
- 運行結果顯示
線程的相關概念
- 程序:程序是含有指令和數(shù)據(jù)的文件,也可以說程序是靜態(tài)代碼,被存儲在磁盤或者其他的數(shù)據(jù)存儲設備中。
- 進程:進程是程序執(zhí)行一次的過程。進程是系統(tǒng)運行程序的單位,因此進程是動態(tài)的。當程序運行時就會被系統(tǒng)載入內存,并且啟動他的工作。對于完全不相關的程序,在同時執(zhí)行時,不會做數(shù)據(jù)的交換,而且可以完全獨立運行。
- 多任務:多任務是在一個系統(tǒng)中可以同時運行多個進程。每個進程都是獨立的任務,每個進程都有自己獨立的內存。所謂的同時運行進程,其實是操作系統(tǒng)將資源分配給各個進程以后,每個進程在CPU上交替運行。
- 線程:線程是比進程更小的執(zhí)行單位。一個進程執(zhí)行過程可以產(chǎn)生多個線程,形成多條執(zhí)行路徑,提高了運行效率。不同的是,同類的多個線程共享同一塊內存,在進行各個線程的切換時開銷比進程小很多。
- 多線程:同時執(zhí)行一個以上的線程,一個線程的執(zhí)行不必等到另一個線程執(zhí)行完成在執(zhí)行。
提示:以下是本篇文章正文內容,下面案例可供參考
一、創(chuàng)建線程的幾種方式
1. 繼承Thread類
- Thread 也是實現(xiàn)Runnable接口
- 管理線程的生命周期
2. 實現(xiàn)Runnable接口
- 只有一個run方法
3.實現(xiàn)Callable接口
- 只有一個call方法帶有返回值
4. 推薦使用Runnable接口
- extends 只能繼承一個類 單繼承
- implements 可以實現(xiàn)多個接口 靈活
- 繼承Thread的類創(chuàng)建的對象 只能調用一次start 方法啟動線程
二、線程安全
1. 線程安全問題引入
- 對于一個變量的操作: 使用 賦值 讀取 寫入 加載 上鎖 解鎖
- 多個線程同時操作同一個變量:就會因為內存中原子操作不及時等原因導致重復(非同步操作)操作
2.解決線程安全問題
- 保證對于這個共享資源的操作必須是原子操作
- 對資源加鎖,操作完成之后釋放鎖
- synchronized 關鍵字
- 隱式鎖 加鎖與解鎖 不可代碼操作的
- Lock接口下的鎖
- 顯式鎖 主動的加鎖 與 解鎖
- lock
- unlock
- 顯式鎖 主動的加鎖 與 解鎖
- synchronized 關鍵字
- 在鎖塊中的代碼如果出現(xiàn)了異常中斷,卡住
- 導致此資源不能被釋放,一直被當前線程占用
- 顯式鎖: 如果出現(xiàn)了異常,可以在finally塊中主動的釋放資源
3. 線程中的可見性問題:
- 一個線程把資源修改了
- 其他線程無法即時得知
(示例):對于兩個線程 t1 和 t2, 用 t2 線程來控制 t1 線程的關閉;
代碼如下:
運行結果顯示
t2 進程結束了,t1 進程還未結束
解決方法
用volatile關鍵字 保證線程間通信即時 (不能作為原子操作的標準)
代碼如下:
運行結果顯示
t2進程結束后,t1進程也結束了。
總結
以上是生活随笔為你收集整理的【Java篇】多线程详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乔布斯的3个工作技巧:教你如何得到自己想
- 下一篇: 最新汽车娱乐系统测试,你了解吗?