大家好,我是你們最愛的齊碼,我最近想改一改作風,我很真誠,說了會分享多線程給大家。滿滿的乾貨,在看這篇文章之前,請關好門窗,防止女朋友打擾你收穫這滿滿的乾貨。前往秋名山的火車就要開動的了,請繫好您的安全帶。
如果你對我的分享質疑,那麼你是對的,我還只是工作半年不到的實習猿。
目錄
- 什麼是進程
- 什麼是線程
- 爲什麼使用多線程
- 線程的6個狀態
- 如何創建線程
- 如何終止線程
- 如何安全的終止線程
1.什麼是進程
進程:操作系統的基礎,是系統進行資源分配和調度的基本單位。同時也是線程的容器。
這時候就會有人質疑我了
定義就是這樣的啊,那好吧,小弟錯了,給個具體的實例好吧,打開我們Windows任務管理器,當中的exe程序就是一個進程啊,好吧還不放過我,那AndroidDevice Monitor中的Devices裏面的都是進程,這總瞭解一點了吧
付:
和你們這羣程序員真難交流,沉悶無趣,在看看我風趣幽默。是不是整天想這些啊,不上進,可恥,還不去加班
2.什麼是進程
這時的我來到了第二車廂
像我們打開qq瀏覽器,有加載網頁的,有處理緩存的,有下載與上圖相關視頻的,這些子任務就是線程啦,當然也可以叫它輕量級進程,線程呢都是有自己的計數器,堆棧,和局部變量等屬性的,可以訪問共享內存變量的
3.爲什麼使用多線程
最牛逼的點來了,我們爲什麼要使用它呢,就像你下載不良視頻,你如果一個線程你告訴我,你能邊下邊播嗎,嘿嘿,可有人又要質疑我,哎,我還是給大家講解一下爲什麼使用多線程吧
- 可以減少程序的響應時間。打個比方啊,是比方,我爲人正直的,假如我手機上有不良視頻,但是那些我看過了,是不是像你們一樣啊,膩了,要下新的,這時候手機迅雷app又要從本地讀取,又要把你的BT種子添加到下載任務,使用多線程是不是就一起開始分別去做這兩件事情,快很多了,嘿嘿
- 與進程相比,線程的創建和切換開銷更小,同時多線程在數據共享方面效率非常高。
- 你們買手機不是喜歡看處理器嗎,買那麼高的處理器,不就是爲了運行多個任務不卡嗎,如果單個線程是不是浪費了億萬資源
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