多線程(學自動力節(jié)點)

1.1什么是進程?什么是線程?

進程是一個應用程序(一個軟件)。線程是一個進程中的執(zhí)行場景/執(zhí)行單元。
一個進程可以啟動多個線程。

1.2對于java程序來說,當在Dos命令窗口中輸入:

java HelloWorld 回車之后。會先啟動JVM,而JVM就是一個進程。
JVM再啟動一個主線程調用main方法。
同時再啟動一個垃圾回收線程負責看護,回收垃圾。
最起碼,現(xiàn)在的java程序中至少有兩個線程并發(fā),一個是垃圾回收線程,一個是執(zhí)行main方法的主線程。

1.3進程與線程的關系?

進程可以看作是一個公司,線程可以看作是一個部門。
注意:進程A和進程B的內存獨立不共享。
線程A和線程B,堆內存和方法區(qū)內存共享。但棧內存獨立,一個線程一個棧。每個棧之間互不干擾,各自執(zhí)行各自的,這就是多線程并發(fā),多線程并發(fā)可以提高效率。

1.4分析

對于單核的CPU來說,真的可以做到真正的多線程并發(fā)嗎?

4核CPU表示同一個時間點上,可以真正的有4個進程并發(fā)執(zhí)行。

什么是真正的多線程并發(fā)?t1線程執(zhí)行t1的,t2線程執(zhí)行t2的,t1、t2不會相互影響。

單核CPU不能做到真正的多線程并發(fā)

1.5在java語言中實現(xiàn)線程有兩種方式。

java支持多線程機制,并且java已經將多線程實現(xiàn)了。我們只需要繼承。
第一種:編寫一個類,直接繼承java.lang.Thread,重寫run方法。

注意:
亙古不變的道理:方法體中的代碼永遠都是自上而下順序執(zhí)行。

第二種方式:編寫一個類,實現(xiàn)java.lang.Runnable接口,實現(xiàn)run方法。

注意:第二種方式實現(xiàn)接口比較常用,因為一個類實現(xiàn)了接口,它還可以去繼承其他的類,比較靈活。

package com.diya.java.thread;

public class ThreadTest01 {
    public static void main(String[] args) {
        System.out.println("main begin");
        m1();
        System.out.println("main over");
    }

    private static void m1() {
        System.out.println("m1 begin");
        m2();
        System.out.println("m1 over");
        
    }

    private static void m2() {
        System.out.println("m2 begin");
        m3();
        System.out.println("m2 over");
    }

    private static void m3() {
        System.out.println("m3 execute");

    }
}
package com.diya.java.thread;
/*
實現(xiàn)線程的第一種方式:
    編寫一個類,直接繼承java.lang.Thread,重寫run方法。

    怎么創(chuàng)建線程對象? new就行了
    怎么啟動線程呢?  調用線程的start()方法
 */
public class ThreadTest02 {
    public static void main(String[] args) {
        //這里是main方法,這里的代碼屬于主線程,在主棧中運行。
        //新建一個分支線程對象。
        MyThread myThread = new MyThread();

        //啟動線程

        //start()方法的作用是:啟動一個分支線程,在JVM中開辟一個新的棧空間
        //這段代碼任務完成之后瞬間就結束了。
        //這段代碼的任務只是為了開啟一個新的棧空間
        //只要新的空間開出來,start()方法就結束了。
        //線程就啟動成功了
        //啟動成功的線程會自動調用run方法,并且run方法在分支棧的底部(壓棧)。
        //run方法在分支棧的棧底部,main方法在主棧的棧底部。run和main是平級的。
        myThread.start();
        //這里的代碼還是運行在主線程中。
        for (int i = 0; i < 1000; i++) {
            System.out.println("主線程-->" + i);
        }

    }
}

class MyThread extends Thread{
    @Override
    public void run() {
        //編寫程序,這段程序運行在分支線程中。(分支棧)
        for (int i = 0; i < 1000; i++) {
            System.out.println("分支線程-->" + i);
        }
    }
}
package com.diya.java.thread;

import java.util.concurrent.ForkJoinWorkerThread;

/*
實現(xiàn)線程的第二種方式:編寫一個類實現(xiàn)java.lang.Runnable接口。
 */
public class ThreadTest03 {
    public static void main(String[] args) {

        //創(chuàng)建一個可運行的對象
        //MyRunnable r = new MyRunnable();

        //將可運行的對象封裝成一個線程對象
        //Thread t = new Thread(r);

        //合寫
        Thread t = new Thread(new MyRunnable());

        //啟動線程
        t.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("主線程-->" + i);
        }

    }
}


//這并不是一個線程類,是一個可運行的類,它還不是一個線程。
class MyRunnable implements Runnable{

    @Override
    public void run() {

        for (int i = 0; i < 100; i++) {
            System.out.println("分支線程-->" + i);
        }

    }
}

線程的生命周期圖(面試會問)
新建狀態(tài)
就緒狀態(tài)
運行狀態(tài)
阻塞狀態(tài)
死亡狀態(tài)

就緒狀體合運行狀態(tài)是不斷切換的

圖片.png

圖片.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Java 多線程 學習筆記 一. 線程與進程 進程是一個應用程序,線程是一個進程中的執(zhí)行場景/執(zhí)行單元。一個進程可...
    六比特派大錘閱讀 328評論 0 0
  • 學習目的 了解進程與線程的概念和關系 了解java多線程 掌握java線程的創(chuàng)建與使用 了解并發(fā)與線程的關系 了解...
    從前的小余兒閱讀 294評論 0 0
  • 什么是進程?什么是線程進程是一個應用程序(1個進程是一個軟件)。線程是一個進程中的執(zhí)行場景/執(zhí)行單元。一個進程可以...
    苦難_69e0閱讀 393評論 0 2
  • 1、什么是線程? 1)線程是輕量級的進程 2)線程沒有獨立的地址空間(內存空間) 3)線程由進程創(chuàng)建(寄生在進程)...
    夏與清風閱讀 3,271評論 0 1
  • 線程基本知識 什么是線程安全性?當多個線程訪問某個類時,這個類始終都能表現(xiàn)出正確的行為,那么可以認為這個類是線程安...
    Cheava閱讀 1,105評論 0 1

友情鏈接更多精彩內容