多線程
一、概念:
並行和併發:
並行是指多個事件在同一時刻發生。
併發是指多個事件在同一時刻間隔發生。
**多線程:**宏觀上的並行,微觀上的串行。
意義:解決併發。
**進程:**資源分配的最小單位,一個進程可以包含多個線程。
**線程:**程序執行的最小單位,一個線程至少屬於一個進程。
二、線程的創建
1、繼承Thread類
/**
*新增一個類,讓該類繼承Thread類,重寫run()方法,相當於是該子類任務要 *去完成的操作。
**/
public class MyThread extends Thread{
@Override
public void run(){
//要執行的操作
}
public static void main(String []args){
//創建線程對象
MyThread t=new MyThread();
//調用線程的start()方法,會開啓線程,JVM會自動調用run()方法
//無法開啓一個已經開啓的線程,否則會報 //IllegalThreadStateException異常。
t.start();
//run()方法可以直接被調用,但是並沒有真正開啓子線程。
t.start();
}
}
2、實現Runnable接口
通過實現Runnable接口,新增一個類,來實現run()方法,來完成子任務。
public class MyRunnable implements Runnable{
public static void main(String []args){
MyRunnable r=new MyRunnable();
Thread t = new Thread(r);
t.start();
@Override
public void run(){
//要執行的操作。
}
}
}
三、線程的方法
static Thread currentThread():
返回當前正在執行的線程對象的引用。
static void sleep(long millis):
在指定的毫秒數內讓當前正在執行的線程進入休眠(阻塞)狀態。
static void yield():
暫停當前正在執行的線程對象,並執行其他對象。(當前線程進入就緒態)
String getName():
返回線程的名稱。
void setName(String name):
改變線程名稱。
void setDaemon(boolean on):
將該線程標記爲守護線程或用戶線程。
void setPriority(int newPriority):
更改線程的優先級。
四、線程的啓動
調用start()方法完成線程的開啓,strat()會自動調用run()方法/
但是如果直接調用run(),不會有運行異常,並不會開啓子線程,整個運行過程中只有一個main主線程。
無法啓動一個已經啓動了的線程,否則會拋出IlleaglThreadStateException異常。
五、線程的優先級
通過線程對象的setPriority()方法可以設置線程的優先級,優先級高的線程只是搶到cpu時間片的概率高,不一定比優先級低的線程先執行。
三個優先級常量:
MAX_PRIORITY 10
NORM_PRIORITY 5
MIN_PRIORITY 1
設置線程的優先級範圍是1-10,設置其他值會拋出異常。
六、守護線程
守護線程就是除了用戶線程之外的線程,是爲了“守護”其他線程,其他線程結束後,守護線程可以不必執行完成而提前終止,可以提高效率。
通過setDaemon(boolean)可以設置該線程是否爲守護線程,默認爲false。