線程的組成部分:
大致結(jié)構(gòu)
1.線程基本信息
- 線程ID(Thread ID): 線程的唯一標(biāo)識符,同一個進(jìn)程內(nèi)不同線程ID不會重疊.
- 線程名稱: 方便用戶識別,系統(tǒng)會自動分配名稱,也可以用戶指定.
- 線程優(yōu)先級: 表示線程調(diào)度的優(yōu)先級,優(yōu)先級越高活的CPU執(zhí)行的機(jī)會就越大.
- 線程狀態(tài): 標(biāo)識線程的執(zhí)行狀態(tài),為新建/就緒/運(yùn)行/阻塞/結(jié)束等狀態(tài)的一種.
- 其他: 是否為守護(hù)線程等等
2.程序計(jì)數(shù)器
在線程的結(jié)構(gòu)中,程序計(jì)數(shù)器很重要,它記錄著線程下一條指令的代碼段內(nèi)存地址.
3.棧內(nèi)存信息
在線程的結(jié)構(gòu)中,程序計(jì)數(shù)器很重要,它記錄著線程下一條指令的代碼段內(nèi)存地址.
線程和進(jìn)程的區(qū)別
- 一個進(jìn)程由一個或者多個線程組成.
- 線程是CPU的最小調(diào)度單元,進(jìn)程是操作系統(tǒng)分配資源的最小單位.
- 一個進(jìn)程內(nèi)線程是可以并發(fā)執(zhí)行的.
- 進(jìn)程之間是相互獨(dú)立的,但是一個進(jìn)程內(nèi)的多個線程并不是完全獨(dú)立的. 各個線程共享方法區(qū)內(nèi)存,堆內(nèi)存,系統(tǒng)資源等.
- 進(jìn)程和線程的上下文切換速度不同. 線程的速度比進(jìn)程要快得多.
Thread類
一個線程在Java中使用一個Thread實(shí)例來描述, Thread類是Java語言的一個重要的基礎(chǔ)類, 位于java.lang包中.
常用Thread的屬性和方法:
public class Thread implements Runnable {
private long tid; 線程的ID, 由線程自己分配
private volatile String name; 線程的名稱, 可以手動設(shè)置(setName())
private int priority; 線程的優(yōu)先級, 默認(rèn)5, 最小1, 最大10
private ThreadGroup group; 線程所屬的線程組
private ClassLoader contextClassLoader; 次線程上下文ClassLoader
private boolean daemon = false; 是否是守護(hù)線程
private volatile int threadStatus = 0; 線程的狀態(tài). 對應(yīng)靜態(tài)枚舉類Stete
public void run(){} 線程的功能方法
public synchronized void start(){} 線程準(zhǔn)備就緒,等待程序調(diào)用run()方法. 異步操作, 調(diào)用順序不代表實(shí)際啟動的順序.
public final void stop(){} 終止當(dāng)前線程, 不建議使用
public static native void sleep(long var0){} 指定毫秒數(shù)讓正在執(zhí)行的線程暫停, 具體取決于系統(tǒng)定時器和調(diào)度程序的精度和準(zhǔn)確性
public final void setPriority(int var1){} 設(shè)置優(yōu)先級, 不一定有用, 影響線程執(zhí)行優(yōu)先級的因素很多
public final void setDaemon(boolean var1){} 設(shè)置守護(hù)線程標(biāo)識
public static native void yield(){} 放棄當(dāng)前CPU執(zhí)行資源,放棄時間不確定
public final native boolean isAlive(){} 判斷線程是否處于活動狀態(tài). 活動狀態(tài): 啟動未終止
public final void resume(){} 恢復(fù)線程, 不建議使用
public final void suspend(){} 暫停線程, 不建議使用
public void interrupt(){} 中斷線程
public static boolean interrupted(){} 測試當(dāng)前線程是否中斷, 并且具備清除狀態(tài)的功能
public boolean isInterrupted(){} 測試當(dāng)前線程是否中斷
public final void join(){} 等待調(diào)用的這個線程終止
public Thread.State getState(){} 獲取線程狀態(tài)
public static enum State {
NEW, 新建
RUNNABLE, 就緒, 運(yùn)行
BLOCKED, 阻塞
WAITING, 等待
TIMED_WAITING, 計(jì)時等待
TERMINATED; 結(jié)束
private State() {
}
}
}
創(chuàng)建線程的方法一
- 繼承Thread類.
- 重寫run()方法, 編寫并發(fā)業(yè)務(wù)代碼.
public class ThreadDemo extends Thread {
@Override
public void run() {
//并發(fā)代碼
// TODO
}
public static void main(String args[]) {
ThreadDemo threadDemo = new ThreadDemo();
threadDemo.start();
}
}
創(chuàng)建線程的方法二
- 實(shí)現(xiàn)Runnable接口
- 重寫run()方法, 編寫并發(fā)業(yè)務(wù)代碼.
public class RunnableDemo implements Runnable {
@Override
public void run() {
//并發(fā)代碼
// TODO
}
public static void main(String args[]) {
Thread thread = new Thread(new RunnableDemo(), "runnable測試線程");
thread.start();
}
}
創(chuàng)建線程的方式三
- 實(shí)現(xiàn)Callable接口(泛型接口, 函數(shù)式接口).
- 實(shí)現(xiàn)call()方法, 有返回值.
public class CallableDemo implements Callable<String> {
@Override
public String call() throws Exception {
//并發(fā)代碼
// TODO
return "OK";
}
public static void main(String args[]) throws ExecutionException, InterruptedException {
CallableDemo callableDemo = new CallableDemo();
FutureTask<String> futureTask = new FutureTask<>(callableDemo);
new Thread(futureTask).start();
String result = futureTask.get();
System.out.println("返回值: " + result);
}
}