線程
線程是調度CPU的最小單元,也叫輕量級進程LWP (Light Weight Process)。
兩個模型:
- 用戶線程(ULT):用戶程序實現,不依賴操作系統核心,應用提供創建、同步、調度和管理線程的函數來控制用戶線程。不需要用戶態/核心態切換,速度快。內核對ULT無感知,線程阻塞則進程(包括它的所有線程)阻塞。
- 內核線程(KLT):系統內核管理線程(KLT),內核保存線程的狀態和上下文信息,線程阻塞不會引起進程阻塞。在多處理器系統上,多線程在多處理器上並行運行。線程的創建、調度和管理由內核完成,效率比ULT要慢,比進程操作快。
線程和進程
多進程:在操作系統中能(同時)運行多個任務(程序)
多線程:在同應用程序中有多 個順序流(同時)執行
創建線程
方式1 :
- 自定義類繼承Thread
- 重寫run()方法
- 在run()方法中增加子線程中要做的事情
- 創建自定義線程類對象
- 調用自定義線程類對象的start()方法 (只能調用一次)
由於Java只支持單繼承,用這種方法定義的類不能再繼承其他類
public class Test {
public static void main(String[] args) {
new Thread() {
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("A:" + i);
}
}
}.start();
for (int i = 0; i < 100; i++) {
System.out.println("B:" + i);
}
}
}
線程的框架
方式1代碼:
public class MyThread extends Thread {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("A");
}
}
}
public class Test {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("B");
}
}
}
方式2
- 自定義類實現Runnable接口
- 實現抽象方法run方法
- 在run方法中增加子線程中要做的事情
- 創建自定義線程類對象
- 創建一個 Thread對象, 把自定義線程類對象作爲Thread構造 器
- 調用Thread對象的start方法啓動線程
方式2代碼:
public class MyRunnable implements Runnable {
@Override
public void run() {
while(true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("A");
}
}
}
public class Test2 {
public static void main(String[] args) {
MyRunnable mr=new MyRunnable();
Thread r=new Thread(mr);
r.start();
}
}