基礎
1.什麼是線程
我也解釋不清,我們先知道它是一個可以獨立運行的單位,然後一個進程可以有多個線程並能多線程同時運行就行了。下面是百度百科解釋,有興趣可以看一下。
線程,有時被稱爲輕量級進程(Lightweight Process,LWP),是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點兒在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。
2.怎樣使用線程
一種:繼承Thread,重寫run()
另一種:實現Runnable接口並把此對象傳給Thread的構造函數
Thread
好啦,那我就來看看Runnable和Thread這兩個類吧
Runnable其實就是一個接口,裏面就一個run方法
public interface Runnable {
public void run();
}
Thread就複雜許多,在實現Runnable接口的基礎上做了許多其它操作,只複製目前我所明白的代碼。
public class Thread implements Runnable {
//下面這些屬性定好了,我們就不要去更改他們的值
private volatile long nativePeer;
volatile ThreadGroup group;//線程所在的組
volatile String name;//線程名字
volatile int priority;//優先級
volatile long stackSize; //線程的堆大小,This has a highly platform-dependent interpretation. It may even be ignored completely.說什麼這個值與平臺相關,自己設置可能也會不起作用,覺得翻譯有誤,英文好的或者理解了它的可以說一下。
Runnable target;
private static int count = 0;
private long id;//線程id,唯一標識,根據上面那個count屬性值得到
public enum State { //線程狀態
//線程被創建但還沒start
NEW,
//The thread may be run.
RUNNABLE,
//線程被阻塞,正在等待鎖
BLOCKED,
//等待
WAITING,
// 線程根據一個指定的時間在等待
TIMED_WAITING,
//線程終止
TERMINATED
}
//構造方法很多,寫一個參數最多的
public Thread(ThreadGroup group, Runnable runnable, String threadName, long stackSize) {
if (threadName == null) {
throw new NullPointerException("threadName == null");
}
//除一個特殊的構造方法,其餘都是這樣子去調用create(),但意思都差不多,初始化那些屬性
create(group, runnable, threadName, stackSize);
}
/**
* 實現Runnable的run(),如果線程有Runnable對象就運行它的run()沒有就啥都不幹。
*/
public void run() {
if (target != null) {
target.run();
}
}
/**
* 開啓一個新線程,運行裏面的run方法,
* @throws IllegalThreadStateException 如果當前線程已經啓動再調用就會拋此異常
*/
public synchronized void start() {···}
/**
* 有兩個重載方法,還有一個是隻有毫秒級別的,迫使發送這個消息的線程休息指定了的時長。
* @param millis 毫秒
* @param nanos 納秒
* @throws InterruptedException 如果當前線程已經被中斷了就拋出InterruptedException,在異常拋出之前當前線程的中斷狀態獎盃清楚掉。
*/
public static void sleep(long millis, int nanos) throws InterruptedException {···}
/**
*跟sleep類似,有三個重載方法。區別在於它指當前線程暫停,直到調用此方法的那個線程方法執行完並結束,或者超過了我們給定的時長。滿足任何一條當前線程就會甦醒。
*/
public final void join(long millis, int nanos) throws InterruptedException {···}
/**
*給線程發送一箇中斷請求,並且這個行爲是依賴於這個線程的狀態State
*當線程處於等待鎖的狀態是無法被中斷的,需要我們捕獲InterruptedException操作推出run()方法。而對於不能捕獲這個異常的,可以用這兩個方法interrupted() isInterrupted()
*/
public void interrupt() {···}
/**
* 靜態方法,查看當前線程自己是否有即將中斷的請求,並會消除中斷標誌
*/
public static native boolean interrupted();
/**
* 常用於一個線程查看另一個線程的中斷狀態,並不會消除中斷標誌
*/
public native boolean isInterrupted();
/**
* 迫使一個calling線程的運行時間屈服與另一個線程的運行時間,爲了實現依賴,我不懂。
*/
public static native void yield();
總結一下:
start()啓動線程運行run();
sleep()和join()暫停線程;
interrupt()中斷線程;