1、在Java中什么是進(jìn)程森缠,什么是線程
- 進(jìn)程:進(jìn)程是程序執(zhí)行的一個(gè)實(shí)例贵涵,進(jìn)程是線程的容器恰画。程序是指令、數(shù)據(jù)及其組織形式的描述跨晴,進(jìn)程是程序的實(shí)體片林。
- 線程:有時(shí)被稱為輕量級(jí)進(jìn)程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元孝偎。線程是進(jìn)程中的一個(gè)實(shí)體凉敲,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位寺旺,線程自己不擁有系統(tǒng)資源阻塑,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源果复,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源虽抄。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行迈窟。
在java中车酣,進(jìn)程大致等于JVM,線程屬于JVM贫悄,線程可以被java應(yīng)用程序在運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建和停止破衔。
2、Java程序中至少有幾個(gè)線程嫡丙?
每個(gè)java程序在main線程內(nèi)執(zhí)行读第,因此每個(gè)java程序至少有一個(gè)線程
3怜瞒、每一個(gè)Java線程都有哪些屬性
- 線程的標(biāo)識(shí)符id
- 線程的名稱
- 線程優(yōu)先級(jí)
- 線程的狀態(tài)
- 線程所屬的線程組
4、線程有哪些狀態(tài)
- NEW:初始狀態(tài)惠窄,線程被構(gòu)建漾橙,但是還沒有調(diào)用start方法
- RUNNABLE:運(yùn)行狀態(tài)霜运,Java線程將被操作系統(tǒng)中的就緒和運(yùn)行兩種狀態(tài)籠統(tǒng)的稱作運(yùn)行中
- BLOCKED:阻塞狀態(tài)蒋腮,表示線程阻塞于鎖
- WAITING:等待狀態(tài)藕各,表示線程進(jìn)入等待狀態(tài)激况,進(jìn)入該狀態(tài)表示當(dāng)前線程需要等待其它線程做出一些特定的動(dòng)作(通知或中斷)
- TIME_WAITING: 超時(shí)等待狀態(tài),該狀態(tài)不同于WAITING宦棺,它可以在指定的時(shí)間內(nèi)自行返回的
- TERMINATED:終止?fàn)顟B(tài)黔帕,表示當(dāng)前線程已經(jīng)執(zhí)行完畢
JDK安裝目錄下bin目錄下執(zhí)行命令jstack工具可以查看代碼運(yùn)行時(shí)的線程信息。
5呐芥、線程的創(chuàng)建方式
- 繼承Thread類創(chuàng)建線程類
- 實(shí)現(xiàn)Runnable接口
一般實(shí)現(xiàn)Runnable接口的方式更好一些奋岁,關(guān)于兩者的對比闻伶,Thread和Runnable的區(qū)別
6、線程為什么不能通過Stop方法停止
stop方法過于暴力光绕,會(huì)直接終止線程畜份,并且立即釋放這個(gè)線程所持有的鎖爆雹,而這些鎖是用來維持對象一致性的,如果此時(shí)慧起,寫線程寫入的數(shù)據(jù)正寫入一半,并強(qiáng)行終止册倒,那么對象就會(huì)被寫壞完慧,同時(shí)由于鎖已經(jīng)被釋放,另外一個(gè)等待該鎖的讀線程就順利成章的讀到了這個(gè)不一致的問題。 --- 《Java高并發(fā)程序設(shè)計(jì)》. 并行程序基礎(chǔ)
7屈尼、下面的程序會(huì)輸出什么
public class MultiThreading {
private static class MyThread extends Thread {
public MyThread(String name) {
super(name);
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
public static void main(String[] args) {
MyThread myThread = new MyThread("myThread");
myThread.run();
myThread.start();
}
}
}
調(diào)用run方法時(shí),是在main線程內(nèi)部執(zhí)行的拴孤。
main
myThread
8脾歧、什么是Daemon線程
守護(hù)線程是一種特殊的線程,在后臺(tái)默默的完成一些系統(tǒng)性的服務(wù)演熟,比如垃圾回收鞭执,JIT線程就可以理解為守護(hù)線程。與之對應(yīng)的是用戶線程芒粹,用戶線程可以理解為系統(tǒng)的工作線程,它會(huì)完成程序應(yīng)該要完成的業(yè)務(wù)操作化漆,如果用戶線程全部結(jié)束估脆,就意味著這個(gè)程序無事可做了,當(dāng)一個(gè)Java應(yīng)用內(nèi)座云,只有守護(hù)線程時(shí)疙赠,Java虛擬機(jī)就會(huì)自然退出。
守護(hù)線程必須在線程start之前設(shè)置朦拖,否則會(huì)拋出IllegalThreadStateException
9圃阳、在Java中,那些操作是原子性的璧帝?
- 讀和寫的操作變量是 主類型的(primitive variables)除了long 和 double
- 讀和寫的變量聲明了volatile