多線程(一)進程與線程

在這裏插入圖片描述
大家好,我是你們最愛的齊碼,我最近想改一改作風,我很真誠,說了會分享多線程給大家。滿滿的乾貨,在看這篇文章之前,請關好門窗,防止女朋友打擾你收穫這滿滿的乾貨。前往秋名山的火車就要開動的了,請繫好您的安全帶。
如果你對我的分享質疑,那麼你是對的,我還只是工作半年不到的實習猿。
在這裏插入圖片描述

目錄
  1. 什麼是進程
  2. 什麼是線程
  3. 爲什麼使用多線程
  4. 線程的6個狀態
  5. 如何創建線程
  6. 如何終止線程
  7. 如何安全的終止線程
1.什麼是進程

在這裏插入圖片描述
進程:操作系統的基礎,是系統進行資源分配和調度的基本單位。同時也是線程的容器。
這時候就會有人質疑我了
在這裏插入圖片描述
定義就是這樣的啊,那好吧,小弟錯了,給個具體的實例好吧,打開我們Windows任務管理器,當中的exe程序就是一個進程啊,好吧還不放過我,那AndroidDevice Monitor中的Devices裏面的都是進程,這總瞭解一點了吧
付:
在這裏插入圖片描述
和你們這羣程序員真難交流,沉悶無趣,在看看我風趣幽默。是不是整天想這些啊,不上進,可恥,還不去加班
在這裏插入圖片描述

2.什麼是進程

這時的我來到了第二車廂
像我們打開qq瀏覽器,有加載網頁的,有處理緩存的,有下載與上圖相關視頻的,這些子任務就是線程啦,當然也可以叫它輕量級進程,線程呢都是有自己的計數器,堆棧,和局部變量等屬性的,可以訪問共享內存變量的

3.爲什麼使用多線程

最牛逼的點來了,我們爲什麼要使用它呢,就像你下載不良視頻,你如果一個線程你告訴我,你能邊下邊播嗎,嘿嘿,可有人又要質疑我,哎,我還是給大家講解一下爲什麼使用多線程吧
在這裏插入圖片描述

  1. 可以減少程序的響應時間。打個比方啊,是比方,我爲人正直的,假如我手機上有不良視頻,但是那些我看過了,是不是像你們一樣啊,膩了,要下新的,這時候手機迅雷app又要從本地讀取,又要把你的BT種子添加到下載任務,使用多線程是不是就一起開始分別去做這兩件事情,快很多了,嘿嘿
  2. 與進程相比,線程的創建和切換開銷更小,同時多線程在數據共享方面效率非常高。
  3. 你們買手機不是喜歡看處理器嗎,買那麼高的處理器,不就是爲了運行多個任務不卡嗎,如果單個線程是不是浪費了億萬資源
4.線程的狀態

車速降了,可以緩一下

  • New 新創建狀態。線程被創建還沒start方法
  • Runnable 可運行狀態。調用start方法,但要看系統給了運行時間沒
  • Blocked 阻塞狀態。被鎖阻塞,暫時不活動
  • Waiting 等待狀態。暫時不活動,不運行任何代碼,直到線程調度器激活它
  • Timed waiting 超時等待狀態。和等待不同的是,在指定的時間返回
  • Terminated 終止狀態。1.run完畢正常退出,2.捕獲異常終止run方法
    盜用大佬圖片,如有侵權,我刪除
    在這裏插入圖片描述
    在這裏插入圖片描述
5.如何創建線程

說了這麼多,虛無的東西可有可無,上代碼纔是王道。就像我們面向百度的複製粘貼工程師一樣,我們簡稱CV工程師,沒事我支持你們,我也是從無盡深淵出來的男人,我懂你們的心酸

  • 5.1繼承Thread 重寫run方法
package com.example.syt.myapplication;

/**
 * Created by syt on 2019/3/1.
 */

public class Text extends Thread{
    @Override
    public void run() {
        System.out.println("我是子線程");
    }

    public static void main(String[] args) {
        Text text=new Text();
        System.out.println("我是主線程");
        text.start();
    }
}
  • 5.2實現Runnable接口,實現接口方法run
package com.example.syt.myapplication;

/**
 * Created by syt on 2019/3/21.
 */

public class TestRunnable implements Runnable{
    @Override
    public void run() {
        System.out.println("我是子線程");
    }

    public static void main(String[] args) {
        System.out.println("我是主線程");
        TestRunnable mTestRunnable=new TestRunnable();
        Thread mThread=new Thread(mTestRunnable);
        mThread.start();

    }
}
  • 5.3實現Callable接口,重寫call方法
package com.example.syt.myapplication;

import java.util.concurrent.Callable;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * Created by syt on 2019/3/21.
 */

public class TestCallable {
    public static class MyTestCallable implements Callable {

        @Override
        public Object call() throws Exception {
            return "我是子線程";
        }

        public static void main(String[] args) {
            System.out.println("我是主線程");
            MyTestCallable myTestCallable=new MyTestCallable();
            ExecutorService executorService= Executors.newSingleThreadExecutor();
            Future mfuture=executorService.submit(myTestCallable);

            try {
                System.out.println(mfuture.get());
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
  • 5.4總結一下
    一般推薦用實現Runnable接口的方式,一個類應該在需要加強或者修改的時候纔會被繼承,這樣比較合理。
    別迷戀我啦,我會的只是一點點,如果你繼續迷戀我,前面的當我沒說
    在這裏插入圖片描述
6. 如何終止線程

在很久很久以前,我以追溯不到了,線程是用stop方法終止的,但是現在用這個interrupt方法比較很合理,線程會不時地檢查中斷標識位,interrupt方法就是將中斷標識位置位。
看看我們的代碼

package com.example.syt.myapplication;

import java.util.concurrent.TimeUnit;

/**
 * Created by syt on 2019/3/21.
 */

public class StopThread {
    public static void main(String[] args) throws InterruptedException {
        MoonRunner runner=new MoonRunner();
        Thread thread=new Thread(runner,"MoonThread");
        thread.start();
        TimeUnit.MILLISECONDS.sleep(10);
        runner.interrupt();
    }
    public static class MoonRunner implements Runnable{
        private long i;
        @Override
        public void run() {
            while (on){
                i++;
                System.out.println("i="+i);
            }
            System.out.println("stop");
        }
    }
}
7. 如何安全的終止線程

直接上代碼

package com.example.syt.myapplication;

import java.util.concurrent.TimeUnit;

/**
 * Created by syt on 2019/3/21.
 */

public class StopThread {
    public static void main(String[] args) throws InterruptedException {
        MoonRunner runner=new MoonRunner();
        Thread thread=new Thread(runner,"MoonThread");
        thread.start();
        TimeUnit.MILLISECONDS.sleep(10);
        runner.cancel();
    }
    public static class MoonRunner implements Runnable{
        private long i;
        private volatile boolean on=true;
        @Override
        public void run() {
            while (on){
                i++;
                System.out.println("i="+i);
            }
            System.out.println("stop");
        }
        public void cancel(){
            on=false;
        }
    }
}

沒有,我真沒有糊弄你們,它們是有區別的,看到這段代碼嗎

private volatile boolean on=true;

這個volatile就厲害啊,多個線程可以對它進行訪問,其他線程就會感受到它的變化,嘿嘿。我就可以在其它線程關閉它了,這樣不是安全點嗎,你揹着你女朋友看小視頻,女朋友進來了,還不讓點擊關閉啊。
如果寫的不好請指出,後續會繼續分享多線程相關的文章,QQ2714730493

在這裏插入圖片描述

奇淫巧計,爲求一讚
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章