java 線程和進程以及線程、Thread、線程五種狀態


Day19個人總結

一、進程和線程

1、概念:

進程包括多個線程,一個進程可以有多個線程,每個獨立運行着的程序稱為一個進程,進程中最少有一個線程,簡單的說進程就是操作系統的一個軟件,線程就是進程中的一條執行路徑

2、多線程的好處:

1)多線程提高執行效率

2)可以提高資源利用率

從宏觀意義上講多線程同一時刻執行多個線程,微觀意義上來說cpu同一時刻只執行一個線程

Cpu時間片段

3、主線程和子線程

主線程:是指系統提供的線程,又叫main線程,由jvm虛擬機提供

子線程:需要程序員自己創建,又叫工作線程

二、Thread類和Runnable接口

1、作用:

用於自己創建的線程又叫子線程,需要繼承Thread類和接口Runnable方能創建線程,創建的子線程默認情況下是隨機和主線程搶占cpu資源進行執行,子線程和主線程兩者是競爭關系,每個字線程都是獨立開辟棧空間,並且是由主線程執行到.strat()來進行棧空間的開辟

2、Thread類方法的使用

類在集成Thread方法之后setName()和getName()方法不能重寫,在原有子類就存在,可以通過super方法調用改變線程的名字,各方法如下:

1)  start()方法用於啟動線程,並且創建新的線程在棧空間中開辟新的空間

2)  run()調用線程對象中的run方法 不會產生新的線程,是在主線程中執行的

3)  join()表示插隊合並插隊到當前線程前

4)  sleep()當前線程睡眠進入到阻塞狀態,釋放cpu資源,其他的線程均可搶占cpu資源

5)setPriority()設置線程優先級優先級高的盡可能多去搶占cpu資源(可能不准)設置范圍為1-10之間,越高表示優先級越高

3、Thread和Runnable的使用資源的共享(關鍵代碼)

public class TestContainer {

    public static void main(String[] args) {

       //創建Container類

       Container container = new Container();

       //創建三個線程操作Container

       Thread thread =new Thread(container,"線程1:");

       Thread thread2 =new Thread(container,"線程2:");

       Thread thread3 =new Thread(container,"線程3:");

       //啟動各個線程

       thread.start();

       thread2.start();

       thread3.start();

    }

}

public class Container implements Runnable{

    private int count=200;

    @Override

    public void run() {

       for(int i=0;i<10;i++){

           System.out.println("我是"+Thread.currentThread().getName()+"count還剩下"+this.getOne());

           //this.getOne();

           try {

              Thread.sleep(100);

           } catch (InterruptedException e){

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

       }

    }

    public int getOne(){

       this.count--;

       return this.count;

    }

}

三、經典面試題

1、start和run的區別

1)start() 會創建新的棧空間並且會產生新的子線程(工作線程)

2)run()調用線程對象中的run方法且不會產生新的線程,是在主線程中執行的

四、終止線程

1、線程終止:

1)  標志位停止線程

2)  .stop()方法終止線程(已過時)使用時可能不能執行完想要執行的程序

3)  Interrupt()方法中斷線程,會拋出異常

2、使用如下:(關鍵代碼)

例1

public class Test5 {

    public static void main(String[] args) {

       // 標志位  停止線程

       C c = new C();

       c.start();

       // 加Scanner 完全是為了模擬 等待的過程

       Scanner scanner = new Scanner(System.in);

       scanner.nextLine();// 等待用戶輸入

       // 改變標志位停止線程

       //c.flag = false;

       // 2 stop方法停止線程

       c.stop();// 不推薦使用,有可能 不能執行完想要執行的內容

    }

}

class C extends Thread{

    boolean flag = true;

    @Override

    public void run() {

       while(flag){

           System.out.println("要睡了");

           try {

              Thread.sleep(2000);

           } catch (InterruptedException e) {

              // TODO Auto-generated catch block

              e.printStackTrace();

           }

           System.out.println("睡醒了");

       }

    }

 

2

public class Test6 {

    public static void main(String[] args) {

       D d = new D();

       d.start();

       Scanner scanner = new Scanner(System.in);

       scanner.next();

        // 通過拋異常的方式 打斷線程的執行

       d.interrupt();

    }

}

class D extends Thread{

    @Override

    public void run() {

      

       System.out.println("要睡了");

       try {

           Thread.sleep(5000);

       } catch (InterruptedException e) {

           System.out.println("被打醒的");

       }

       System.out.println("自然醒");

      

    }

}

3、線程的五種狀態(又叫生命周期,不是非常准確)

圖解:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM