1. 程式人生 > >javaSE高階開發多執行緒——1 程序與執行緒 and 2 多執行緒的實現

javaSE高階開發多執行緒——1 程序與執行緒 and 2 多執行緒的實現

一、程序與執行緒
1.程序的概念

  • 執行緒隸屬於某個程序,程序是一個程式的執行週期,但是我們的執行緒是執行程序中的某個任務
  • 所以如果程序不存在的話,那麼執行緒自然也就不會存在了。
  • 我們應該時刻將執行緒和任務對等起來,執行一個程式啟動一個程序。這樣就可以提升沃恩程式的執行能力。
    2.程序與執行緒的區別
    (1)對於這個問題,我們首先需要知道程序與執行緒的概念,從它們的概念上我們可以知道程序是巨集觀的,它相對於執行緒來說是它的載體,它是執行一個任務時的週期。但是對於我們的執行緒,它時隸屬於程序了,它的存在必須以一個程序為載體,所以執行緒只是程序裡面的一部分。
    (2)程序的建立在電腦裡面同一時間裡一直建立是有限的,但是執行緒只要程序不終止它就可以一直建立。
    3.執行緒狀態(這個圖非常重要,記住,這個JavaSE階段唯一一個要自己會畫的圖)
    在這裡插入圖片描述

    對上面圖的解釋:
    建立:建立執行緒,建立好一個執行緒是處於就緒狀態。它處於就緒狀態等待執行,不是有誰去通知它,而是它此時沒有獲取CPU的時間片段。
    CPU的時間片段:對於單核的CPU在同一時間只能處理一個執行緒。它即將自己的時間片段做了很多分割,就緒是因為CPU處於忙的狀態。
    阻塞狀態:出現阻塞狀態時因為當一個執行緒在執行了很長時間以後CPU會將它暫停一會,將時間片段給另外的執行緒使用,這個時候這個執行緒就處於阻塞狀態;當阻塞一會以後CPU又重新分配時間片段給這個執行緒的時候,它就會從阻塞狀態到就緒狀態,然後再到執行狀態,接著上一次的zh中斷地方開始執行。
    終止:就是執行緒執行完畢以後的狀態。
    對於執行緒的狀態:

(1)建立----就緒
(2)建立-----就緒----執行----終止
(3)建立----就緒----阻塞
(4)建立----就緒----執行----阻塞-----就緒----執行----終止
二、多執行緒的實現
1.通過繼承Thread類實現多執行緒
利用這個繼承的類來實現建立程序,它的構造方法我們可以自己定義,根據我們的需求。

package com.wschase.xianchengjianjie;

/**1.程序與執行緒
 * (1)通過繼承Thread類實現多執行緒 :用繼承Thread的這個類來建立執行緒物件,我們可以根據自己的需要覆寫這個子類的構造方法
 * (2)Thread的run方法不會啟動執行緒,只是普通的方法呼叫
 * (3)Thread的start方法啟動執行緒 ,start方法只需要呼叫一次
 * Author:WSChase
 * Created:2019/1/8
 */
public class Thread1 extends  Thread{
        public final String title;

    public Thread1(String title) {
        this.title = title;
    }

    @Override
    public void run() {
        //多執行緒處理的業務邏輯
        for (int i=0;i<10;i++){
            System.out.println(this.title+" "+i);
        }
    }

    public static void main(String[] args) {

        //注意:下面的執行是按照順序執行的,run方法只是一個普通方法,它不能啟動執行緒
       //注意:先啟動的不一定先執行,它們都在就緒狀態。
        Thread1 thread1=new Thread1("執行緒1");
        //thread1.run();
        thread1.start();

         Thread1 thread11=new Thread1("執行緒2");
         //thread11.run();
        thread11.start();

    }
}

2.通過實現Runnable介面建立多執行緒
(1)代理模式
採用這個方法,我們需要用到開閉原則,用一個代理來實現Runnable介面,裡面是真正要實現的功能,而我們在另外一個類裡面只是使用這個類裡面的方法即可。

package com.wschase.xianchengjianjie;

/**2.Runnable介面實現多執行緒----通過代理模式來實現的,這樣保證了開閉原則
 * 使用多執行緒方法
 * 1.複用業務邏輯
 * 2.實現runnable介面,可以繼續實現介面
 * Author:WSChase
 * Created:2019/1/8
 */
public class PrintInfo {
    //這是一個普通任務
    public void print(Object ... args){
        for(int i=0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }

    public static void main(String[] args) {
       // new PrintInfo().print("hello","world");
        //使用多執行緒訪問----通過Runnable
        PrintInfo task=new PrintInfo();
        Runnable runnable=new PersonInfo(task);

        //public Thread(Runnable target)----》這是Thread的構造方法
        Thread thread=new Thread(runnable);//Thread方法裡面需要RUnnable介面的例項化物件
        thread.start();
    }
}

//這是個普通的類實現Runnable介面,這個類就是代理類,代理模式
class PersonInfo implements Runnable{
    private final PrintInfo task;

    public PersonInfo(PrintInfo task) {
        this.task = task;
    }

    @Override
    public void run() {
        this.task.print("hello","java","best");
    }
}

(2)Lambda表示式
將代理類裡面實現的方法直接在我們的覆寫方法中實現。

package com.wschase.xianchengjianjie;

/**2.Runnable介面實現多執行緒
(1)通過代理模式來實現的,這樣保證了開閉原則
 * 使用多執行緒方法
 * 1.複用業務邏輯
 * 2.實現runnable介面,可以繼續實現介面
 * (2)可以採用匿名內部類----》再轉化為Lambda表示式
 * Author:WSChase
 * Created:2019/1/8
 */
public class PrintInfo {
    //這是一個普通任務
    public void print(Object ... args){
        for(int i=0;i<args.length;i++){
            System.out.println(args[i]);
        }
    }

    public static void main(String[] args) {
       // new PrintInfo().print("hello","world");
        //使用多執行緒訪問----通過Runnable
        PrintInfo task=new PrintInfo();
//        Runnable runnable=new PersonInfo(task);
//        //public Thread(Runnable target)----》這是Thread的構造方法
//        Thread thread=new Thread(runnable);//Thread方法裡面需要RUnnable介面的例項化物件
//        thread.start();

        //(2)採用lambda表示式
        Thread thread=new Thread(new Runnable() {
            @Override
            public void run() {
                //直接實現了我們代理類裡面的功能,不需要再建立一個類了
                task.print("hello","nihao");
            }
        });
        thread.start();
    }
}