一、進(jìn)程與線程
認(rèn)識(shí)
- 程序由指令和數(shù)據(jù)組成,簡(jiǎn)單來(lái)說(shuō),進(jìn)程可以視為程序的一個(gè)實(shí)例
- 大部分程序可以同時(shí)運(yùn)行多個(gè)實(shí)例進(jìn)程,例如記事本、畫(huà)圖、瀏覽器等
- 少部分程序只能同時(shí)運(yùn)行一個(gè)實(shí)例進(jìn)程,例如QQ音樂(lè)、網(wǎng)易云音樂(lè)等
- 一個(gè)進(jìn)程可以分為多個(gè)線程,線程為最小調(diào)度單位,進(jìn)程則是作為資源分配的最小單位
- 在Windows中進(jìn)程是不活動(dòng)的,只是作為線程的容器
對(duì)比
- 進(jìn)程之間基本相互獨(dú)立,而線程存在于進(jìn)程內(nèi),是進(jìn)程的一個(gè)子集
- 進(jìn)程擁有的資源供其內(nèi)部的線程共享
- 進(jìn)程間通信較為復(fù)雜
- 同一臺(tái)計(jì)算機(jī)的進(jìn)程通信稱為IPC
- 不同計(jì)算機(jī)之間的進(jìn)程通信需要通過(guò)網(wǎng)絡(luò),遵守共同的協(xié)議,例如HTTP
- 線程更輕量,線程上下文切換成本一般上要比進(jìn)程上下文切換低
二、概念總覽
并行與并發(fā)
- 同一時(shí)刻同時(shí)發(fā)生,即為并行
- 同一時(shí)段同時(shí)發(fā)生,即為并發(fā)
同步與異步
- 需要等待結(jié)果返回,才能繼續(xù)運(yùn)行就是同步
- 不需要等待結(jié)果返回,自顧自地運(yùn)行就是異步
三、創(chuàng)建和運(yùn)行線程
- 方法一:直接使用Thread
@Test
public void test1(){
//創(chuàng)建一個(gè)新線程
Thread thread1=new Thread("t1"){
//設(shè)置線程的具體任務(wù)
public void run(){
log.info("success");
}
};
//啟動(dòng)線程
thread1.start();
log.info("error");
}
- 方法二:使用Runnable配合Thread
用這種方式將線程Thread和任務(wù)Runnable分開(kāi),更容易組件化操作文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-604941.html
@Test
public void test2(){
Runnable runnable=new Runnable() {
@Override
public void run() {
log.info("success");
}
};
//創(chuàng)建新線程并命名
Thread thread2=new Thread(runnable,"t2");
thread2.start();
log.info("error");
}
- 方法三:使用FutureTask配合Thread
@Test
public void test4() throws ExecutionException, InterruptedException {
FutureTask<Integer> futureTask=new FutureTask<>(new Callable<Integer>() {
//使用Callable還有一個(gè)好處就是能夠返回值,而Runnable不行
@Override
public Integer call() throws Exception {
log.info("success");
Thread.sleep(1000);
return 100;
}
});
Thread thread4=new Thread(futureTask,"t4");
thread4.start();
//捕獲到線程執(zhí)行完成并獲取返回值進(jìn)行后續(xù)處理
Integer result=futureTask.get();
log.info("error:{}",result);
}
四、查看進(jìn)程線程的方法
Windows
- 可以通過(guò)任務(wù)管理器來(lái)看
- tasklist:查看進(jìn)程
- taskkill:殺死進(jìn)程
Linux
- ps -ef 查看所有進(jìn)程
- ps -ef | grep java :查詢帶Java的進(jìn)程
- kill 殺死進(jìn)程,kill -9 強(qiáng)制殺死進(jìn)程
- top 進(jìn)程排名
Java
- jps:查看所有Java進(jìn)程
- jconsole:查看某個(gè)Java進(jìn)程中線程的運(yùn)行情況(圖形界面),具體操作步驟如下
五、線程運(yùn)行的原理
棧與棧幀
- 每個(gè)棧由多個(gè)棧幀組成,對(duì)應(yīng)著每次方法調(diào)用時(shí)所占用的內(nèi)存
- 每個(gè)線程只能有一個(gè)活動(dòng)棧幀,對(duì)應(yīng)著當(dāng)前正在執(zhí)行的那個(gè)方法
上下文切換
- 由一個(gè)線程切換到另一個(gè)線程即上下文切換,通俗來(lái)說(shuō),也就是要把線程運(yùn)行的環(huán)境換一下,換成線程之前運(yùn)行時(shí)的環(huán)境
- 專業(yè)一點(diǎn)就是,每次線程切換時(shí),操作系統(tǒng)會(huì)保存當(dāng)前線程的狀態(tài),并恢復(fù)另一個(gè)線程的狀態(tài)
- 狀態(tài)包括程序計(jì)數(shù)器、棧幀中的信息,如局部變量、操作數(shù)棧、返回地址等
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-604941.html
到了這里,關(guān)于Java并發(fā)編程學(xué)習(xí)筆記(一)線程的入門(mén)與創(chuàng)建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!