1、在Java中什么是進程,什么是線程
- 進程:進程是程序執(zhí)行的一個實例,進程是線程的容器。程序是指令、數(shù)據(jù)及其組織形式的描述,進程是程序的實體。
- 線程:有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。
在java中,進程大致等于JVM,線程屬于JVM,線程可以被java應用程序在運行時動態(tài)的創(chuàng)建和停止。
2、Java程序中至少有幾個線程?
每個java程序在main線程內(nèi)執(zhí)行,因此每個java程序至少有一個線程
3、每一個Java線程都有哪些屬性
- 線程的標識符id
- 線程的名稱
- 線程優(yōu)先級
- 線程的狀態(tài)
- 線程所屬的線程組
4、線程有哪些狀態(tài)
- NEW:初始狀態(tài),線程被構建,但是還沒有調(diào)用start方法
- RUNNABLE:運行狀態(tài),Java線程將被操作系統(tǒng)中的就緒和運行兩種狀態(tài)籠統(tǒng)的稱作運行中
- BLOCKED:阻塞狀態(tài),表示線程阻塞于鎖
- WAITING:等待狀態(tài),表示線程進入等待狀態(tài),進入該狀態(tài)表示當前線程需要等待其它線程做出一些特定的動作(通知或中斷)
- TIME_WAITING: 超時等待狀態(tài),該狀態(tài)不同于WAITING,它可以在指定的時間內(nèi)自行返回的
- TERMINATED:終止狀態(tài),表示當前線程已經(jīng)執(zhí)行完畢
JDK安裝目錄下bin目錄下執(zhí)行命令jstack工具可以查看代碼運行時的線程信息。
5、線程的創(chuàng)建方式
- 繼承Thread類創(chuàng)建線程類
- 實現(xiàn)Runnable接口
一般實現(xiàn)Runnable接口的方式更好一些,關于兩者的對比,Thread和Runnable的區(qū)別
6、線程為什么不能通過Stop方法停止
stop方法過于暴力,會直接終止線程,并且立即釋放這個線程所持有的鎖,而這些鎖是用來維持對象一致性的,如果此時,寫線程寫入的數(shù)據(jù)正寫入一半,并強行終止,那么對象就會被寫壞,同時由于鎖已經(jīng)被釋放,另外一個等待該鎖的讀線程就順利成章的讀到了這個不一致的問題。 --- 《Java高并發(fā)程序設計》. 并行程序基礎
7、下面的程序會輸出什么
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方法時,是在main線程內(nèi)部執(zhí)行的。
main
myThread
8、什么是Daemon線程
守護線程是一種特殊的線程,在后臺默默的完成一些系統(tǒng)性的服務,比如垃圾回收,JIT線程就可以理解為守護線程。與之對應的是用戶線程,用戶線程可以理解為系統(tǒng)的工作線程,它會完成程序應該要完成的業(yè)務操作,如果用戶線程全部結束,就意味著這個程序無事可做了,當一個Java應用內(nèi),只有守護線程時,Java虛擬機就會自然退出。
守護線程必須在線程start之前設置,否則會拋出IllegalThreadStateException
9、在Java中,那些操作是原子性的?
- 讀和寫的操作變量是 主類型的(primitive variables)除了long 和 double
- 讀和寫的變量聲明了volatile