建立、實現多線程

1.建立線程的方式

1.繼承Thread,重寫run方法。異步

public class MyThread extends Thread {
    @Override
    public void run() {
        int i = 0;
        while(i < 100){
            i++;
            System.out.println("thread: i = "+i);
        }
    }
}

class Demo{
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();
        for (int j = 0; j < 100; j++) {
            System.out.println("main: j = "+j);
        }        
    }
}

2.實現Runnable接口ide

public class CountTask implements Runnable {
    @Override
    public void run() {
        int i = 0;
        while(i < 100){
            i++;
            System.out.println("thread: i = "+i);
        }
    }
}

class Demo22{
    public static void main(String[] args) {
        Thread thread = new Thread(new CountTask());
        thread.start();
    }
}

三、實現Callable接口**線程

經過實現Callable接口並重寫call方法,並把Callable實例傳給FutureTask對象,再把FutureTask對象傳給Thread對象。它與Thread、Runnable最大的不一樣是Callable能返回一個異步處理的結果Future對象並能拋出異常,而其餘兩種不能。code

2.啓動線程的方式

調用Thread類型對象的start()方法。注意若是調用run()方法的話,只是簡單的方法調用,而不是開啓一條新的線程。對象

3.線程的狀態

在Thread類的源碼中能夠看到定義瞭如下的線程的狀態繼承

狀態 含義 詳情
NEW 新建 線程被建立了,但未開始運行
RUNNABLE 可運行 調用start()後會變成該狀態。該狀態的線程位於可運行線程池中,變得可運行,等待獲取cpu的執行權
BLOCKED 阻塞 代表當前線程(A)正在等待獲取一個(L),獲取鎖後才能進入或再次進入同步的代碼塊或方法(即臨界區)。當另外一條持有這個鎖的線程(B),調用了鎖對象(L)的wait()方法後,當前線程(A線程)纔有機會獲取到鎖(L)
WAITING 等待 當前線程(A)已得到了,已在臨界區中。當調用了Object.wait()、Thread.join()、LockSupport.park()等方法(都不包含超時參數)後就會進入到等待狀態。 等待的含義是當前線程(A)正在等待其它線程(B)執行對應的操做,當前線程才能回到RUNNABLE狀態。好比:A線程調用了Object.wait(),那麼A須要等待B線程調用Object.notify()或Object.notifyAll(),A才能回到RUNNABLE狀態;A線程調用了B線程的join(),代表A須要等待B執行完,才能回到RUNNABLE狀態,纔有機會得到cpu執行權繼續運行代碼。
TIMED_WAITING 等待超時 當前線程(A)已得到了,已在臨界區中。當調用瞭如下方法,就會進入等待超時的狀態(含超時參數):Thread.sleep()、Object.wait()、Thread.join()、LockSupport.parkNanos、LockSupport.parkUntil。請注意wait和sleep的區別:wait是Object上的方法,sleep是Thread上的方法。wait會釋放鎖,但sleep不會釋放鎖。
TERMINATED 終結 Thread.run()方法運行完,就進入該狀態
相關文章
相關標籤/搜索