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、線程的五種狀態(又叫生命周期,不是非常准確) 圖解:
|