iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
Software Development

大學耍廢的我要學Java翻身系列 第 15

Day15: Java的多main宇宙(上)

  • 分享至 

  • xImage
  •  

多執行緒

執行緒

執行緒是作業系統分配處理器時間的基本單位
在先前我們使用的main()方法都是單一的執行緒
執行緒的生命週期如下
https://ithelp.ithome.com.tw/upload/images/20220929/2013719249k6KBIqHQ.png
在執行緒裡面有個start方法(很像是process中的New),當我們呼叫它就會執行我們的執行緒,然後就會跑到Runnable(就是process中的Ready)等待排班器安排執行,執行的時候(Running)可能會遇到Block事件,像是sleep方法就會進入Blocked,等時間到了就會回到Runnable繼續等待下一次執行,當我們執行run方法執行完畢就會進入Dead結束

多執行緒

多執行緒簡單來說就是可以同時執行很多程式 => 多工
讓我們原本要一個個排隊做的工作,變成一次四五個工作一起做,所以我們工作處理時間變得比較快,效率也比較高,像是我們的網站就是用到多執行緒的功能,一個網站會有很多個使用者登入去使用我們的網站,每當我們一個使用者進來,我們就會產生一個執行緒,所以不同的使用者同時去使用網站並不會互相干擾

Java實作

繼承Thread

將物件繼承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(每次的順序都不一樣),就像是小孩子長大了一樣,各過各的生活

實作Runnable介面

可以繼承其他物件,還可以繼續實作其他介面
一定要加入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");
    }
}

上一篇
Day14: 常見例外和集合
下一篇
Day16: Java的多main宇宙(下)
系列文
大學耍廢的我要學Java翻身30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言