《Java多線程系列一》線程是什么?怎么理解多線程!學(xué)不會(huì)就是我笨!
目錄
1、什么是線程
2、線程的狀態(tài)
3、怎么通俗理解進(jìn)程,線程?
4、線程和進(jìn)程的區(qū)別
5、什么是線程安全
6、如何創(chuàng)建線程
1、什么是線程
線程是操作系統(tǒng)調(diào)度的最小單元,也叫輕量級(jí)進(jìn)程。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。同一進(jìn)程可以創(chuàng)建多個(gè)線程,每個(gè)進(jìn)程都有自己獨(dú)立的一塊內(nèi)存空間。并且能夠訪問共享的內(nèi)存變量。
2、線程的狀態(tài)
線程的狀態(tài)一般看到的也就是Runable 和blocked ,最多的還是blocked,因?yàn)閏pu的時(shí)間片很短,切換的很快等待IO,等待臨界資源。大概知道就好
3、怎么通俗理解進(jìn)程,線程?
舉個(gè)例子,開了一家餐廳,餐廳這個(gè)實(shí)體就是進(jìn)程,餐廳里的服務(wù)員就是線程,餐廳里的座位就是資源(游戲內(nèi)的數(shù)據(jù)),所有的服務(wù)員都可以安排客人就座,多個(gè)服務(wù)員安排座位就是多線程競爭,鎖也就是去排號(hào)。線程池就是有多個(gè)服務(wù)員一直站在那里等著被呼叫。
4、線程和進(jìn)程的區(qū)別
進(jìn)程它是具有獨(dú)立地址空間的,優(yōu)點(diǎn)就是隔離度好,穩(wěn)定,因?yàn)樗遣僮飨到y(tǒng)管理的,進(jìn)程和進(jìn)程之間是邏輯隔離的,只要操作系統(tǒng)不出問題的話,一個(gè)進(jìn)程的錯(cuò)誤一般不會(huì)影響到其它進(jìn)程,缺點(diǎn)就是信息資源共享麻煩。而線程只是進(jìn)程啟動(dòng)的執(zhí)行單元,它是共享進(jìn)程資源的,創(chuàng)建銷毀、切換簡單,速度很快,占用內(nèi)存少,CPU利用率高。但是需要程序員管控的東西也比較多,相互影響出問題的機(jī)率較大,一個(gè)線程掛掉將導(dǎo)致整個(gè)進(jìn)程掛掉,所以從程序員的角度來講,我們只能看到某種代碼是線程安全的,而沒有說進(jìn)程安全的。
5、什么是線程安全
在擁有共享數(shù)據(jù)的多條線程并行執(zhí)行的程序中,線程安全的代碼會(huì)通過同步機(jī)制保證各個(gè)線程都可以正常且正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)污染等意外情況。
類比:在餐廳里,每個(gè)服務(wù)員都有一份自己排號(hào),比如我剛剛安排了一個(gè)人去坐在8號(hào)座,那我想當(dāng)然的以為是下一個(gè)是9號(hào)座,如果另外一個(gè)服務(wù)員同時(shí)安排了9號(hào)桌,我再去安排就會(huì)造成數(shù)據(jù)不安全了,出現(xiàn)問題了。
6、如何創(chuàng)建線程
java創(chuàng)建線程的三種方式:
繼承Thread類創(chuàng)建線程類,無法繼承其他類。
實(shí)現(xiàn)Runnable接口
通過Callable和Future創(chuàng)建線程
package thread;
/**
* @author 香菜
*/
public class ExtendThread extends Thread {
@Override
public void run() {
System.out.println("ExtendThread");;
}
}
package thread;
import java.util.concurrent.Callable;
/**
* @author 香菜
*/
public class ImpCallable implements Callable
@Override
public Integer call() throws Exception {
System.out.println("Callable ");
return 1;
}
}
package thread;
/**
* @author 香菜
*/
public class ImpRunnable implements Runnable {
@Override
public void run() {
System.out.println("Runnable");
}
}
package thread;
import java.util.concurrent.FutureTask;
/**
* @author 香菜
*/
public class Aain {
public static void main(String[] args) {
new ExtendThread().start();
new Thread(new ImpRunnable()).start();
new Thread(new FutureTask<>(new ImpCallable())).start();
}
}
總結(jié):線程的概念來自于生活,理解了概念,在項(xiàng)目中思考的時(shí)候只要搞清楚項(xiàng)目的線程模型,基本上不會(huì)遇到太大的問題。下期寫下future,好了,我繼續(xù)刷題去了。
先學(xué)會(huì)這些調(diào)試技巧,再寫代碼,效率提高十倍。吐血整理!
Java 任務(wù)調(diào)度 多線程
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。