認識執行緒
1. 為什麼需要執行緒
2. 如何理解執行緒
執行緒是程序的一部分, 一個pcb結構體描述一個執行緒, 多個pcb結構體物件(多個執行緒) 串起來等於一個程序
3. 為什麼說執行緒比程序建立/銷燬開銷小 ?
4. 程序和執行緒之間的區別與聯絡
1. 程序包含執行緒! 一個程序裡面可以有一個執行緒,也可以有多個執行緒。
2. 程序在頻繁建立和銷燬中,開銷更高. 而只有第一次建立執行緒(程序), 才會申請資源, 之後建立執行緒都不會在申請資源, 因為執行緒之間資源共享
3. 程序是系統分配資源(記憶體,檔案資源....) 的基本單位。執行緒是系統排程執行的基本單位(CPU)
4. 程序之間是相互獨立的, 一個程序掛了其他程序一般都沒事. 但是, 在一個程序內部的多個執行緒之間, 一個執行緒掛了,整個程序都掛了
5. 建立執行緒的寫法
1. 建立thread子類, 重寫run()方法
檢視程式碼
class MyThread extends Thread {
@Override
public void run() {
// 這裡寫的程式碼, 就是該執行緒要完成的工作
while (true) {
System.out.println("hello thread");
// 讓執行緒主動進入"堵塞狀態", 短時間停止去cpu上執行
// 單位 1000 ms (毫秒) => 1 s (秒)
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Test {
public static void main(String[] args) {
// Thread 類表示執行緒
Thread t = new MyThread();
t.start(); // 建立執行緒, 線上程中呼叫run()
while (true) {
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
2. 透過Runable介面
檢視程式碼
class MyRunnable implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class Test {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable());
t.start();
while (true) {
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
兩種寫法的區別
3. 匿名內部類方式
本質上和方法一是一樣的
class test {
public static void main(String[] args) {
Thread t = new Thread() {
@Override
public void run() {
while (true) {
System.out.println("hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
while (true) {
System.out.println("hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}