執行緒是作業系統分配處理器時間的基本單位
在先前我們使用的main()方法都是單一的執行緒
執行緒的生命週期如下
在執行緒裡面有個start方法(很像是process中的New),當我們呼叫它就會執行我們的執行緒,然後就會跑到Runnable(就是process中的Ready)等待排班器安排執行,執行的時候(Running)可能會遇到Block事件,像是sleep方法就會進入Blocked,等時間到了就會回到Runnable繼續等待下一次執行,當我們執行run方法執行完畢就會進入Dead結束
多執行緒簡單來說就是可以同時執行很多程式 => 多工
讓我們原本要一個個排隊做的工作,變成一次四五個工作一起做,所以我們工作處理時間變得比較快,效率也比較高,像是我們的網站就是用到多執行緒的功能,一個網站會有很多個使用者登入去使用我們的網站,每當我們一個使用者進來,我們就會產生一個執行緒,所以不同的使用者同時去使用網站並不會互相干擾
將物件繼承Thread,並覆寫我們的run方法,但該物件會無法繼承其他物件
一定要加入thread.start()
// Main.java
public class Main {
public static void main(String[] args){
System.out.println("main Thread start");
TestThread thread1 = new TestThread("thread1");
TestThread thread2 = new TestThread("thread2");
TestThread thread3 = new TestThread("thread3");
thread1.start();
thread2.start();
thread3.start();
System.out.println("main thread end");
}
}
// TestThread.java
public class TestThread extends Thread {
private String name;
public TestThread(String name){
this.name = name;
}
// 覆寫run方法
public void run(){
System.out.println(name + " Running");
}
}
會發現我們的thread會等main方法end之後才會開始一個一個執行thread(每次的順序都不一樣),就像是小孩子長大了一樣,各過各的生活
可以繼承其他物件,還可以繼續實作其他介面
一定要加入thread.start()
// Main.java
public class Main {
public static void main(String[] args){
System.out.println("main Thread start");
// 使用Runnable時是用Thread定義變數
// 在使用thread建構子放入runnable參數型別的建構子
Thread thread1 = new Thread(new TestRunnable("thread1"));
Thread thread2 = new Thread(new TestRunnable("thread2"));
Thread thread3 = new Thread(new TestRunnable("thread3"));
thread1.start();
thread2.start();
thread3.start();
System.out.println("main thread end");
}
// TestRunnable
public class TestRunnable implements Runnable {
private String name;
public TestRunnable(String name){
this.name = name;
}
public void run(){
System.out.println(name + " Running");
}
}
這裡就和前面不一樣,會隨機跑thread,如果和前面一樣的話可以嘗試在Thread加上sleep(1000)
// Main.java
public class Main {
public static void main(String[] args){
System.out.println("main Thread start");
// 使用Runnable時是用Thread定義變數
// 在使用thread建構子放入runnable參數型別的建構子
Thread thread1 = new Thread(new TestRunnable("thread1"));
Thread thread2 = new Thread(new TestRunnable("thread2"));
Thread thread3 = new Thread(new TestRunnable("thread3"));
thread1.start();
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
thread2.start();
try {
Thread.sleep(1000);
}catch (InterruptedException e){
e.printStackTrace();
}
thread3.start();
System.out.println("main thread end");
}
// TestRunnable
public class TestRunnable implements Runnable {
private String name;
public TestRunnable(String name){
this.name = name;
}
public void run(){
System.out.println(name + " Running");
}
}