馬斯克:如果特斯拉 FSD Beta v10.11 表現好,考慮降低參測最低安全分要求
阿新 • • 發佈:2022-03-14
多執行緒基礎
- 程序:程序就是執行中的程式,當被關閉的時候,這段程序也關閉。比如我們玩玩遊戲,開啟遊戲作業系統會為該程序分配一個空間,當退出遊戲是,程序也就結束了
- 執行緒:執行緒是由程序建立的,是程序的實體。比如我們下載東西,可以同時下載幾個,下載一個就開啟一個執行緒。再比如,qq聊天可以跟多個人聊,一個聊天對話方塊就是一個執行緒,可以擁有好幾個執行緒。
- 一個程序可以有多個執行緒
- 單執行緒和多執行緒的基本概念:
- 單執行緒:同一時刻,只允許執行一個執行緒
- 多執行緒:同一時刻,可以執行多給執行緒,比如qq可以多個聊天視窗
- 併發:同一時刻,多個任務交替執行,造成“貌似同時”的錯句,簡單的說;單核cpu實現的多工就是併發。理解:只有一個cpu去執行兩個程式,在同一時刻cpu只能去執行一個程式,cpu只能來回切換,執行完一個在執行一個,但是這速度切換的非常快,好似同時執行一樣
- 並行:同一時刻,多個任務同時執行。多核cpu可以實現並行,也可能出現併發和並行同時存在。加入我們電腦有兩個cpu,有三個程式,這樣就有一個是併發一個是並行
執行緒的基本使用
- 建立執行緒的兩種方式
- 繼承Thread類,重寫run方法
- 實現Runnable介面,重寫run方法
- 說明:當一個類繼承了Thread類,該類就可當作執行緒使用
- 說明:為什麼會有兩個關於執行緒的建立方式,因為java是單繼承的,因此,繼承了Thread就不能繼承其他類,所以我們可以使用Runnable介面
- 執行緒的方法和注意事項
package com.yc.join; public class join_ { public static void main(String[] args) throws InterruptedException { /** * 1.主執行緒每隔1s,輸出hi,-共10次 * 2.當輸出到hi 到5時,啟動一個子執行緒(要求實現Runnable),每隔1s輸出hello ,等該執行緒輸出10次hello後,退出 * 3.主執行緒繼續輸出hi ,直到主執行緒退出, */ Thread thread = new Thread(new num()); for (int i = 0;i < 10; i++){ System.out.println("hi"+ i ); if (i == 5){ //執行執行緒 thread.start(); //插入執行緒 thread.join(); } //睡眠1秒 Thread.sleep(1000); } } } class num extends Thread{ private int count = 0; @Override public void run() { while (true){ System.out.println("hello"+(++count)); try { //休眠一秒 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (count == 10){ break; } } } }
使用者執行緒和守護執行緒
使用者執行緒:也叫工作執行緒,當執行緒的任務執行完以通知的方式結束
守護執行緒:一般為工作執行緒服務,當所有的使用者執行緒結束,守護執行緒自動結束
常見的守護執行緒:垃圾回收機制
案例
執行緒的生命週期
JDK 中用Thread.State 列舉表示了執行緒的幾種狀態
執行緒狀態轉換圖
執行緒的同步
-
執行緒同步機制(synchronized)
互斥鎖
案例
package com.yc.Homework; /** * (1)有2個使用者分別從同一個卡上取錢(總額:10000) * (2)每次都取1000,當餘額不足時,就不能取款了 * (3)不能出現超取現象=》執行緒同步問題. */ public class Homework02 { public static void main(String[] args) { AAA aaa = new AAA(); AAA aaa1 = new AAA(); //aaa1.start();這裡不能呼叫,得用下面的方法 Thread thread = new Thread(aaa);//構造器傳入一個物件方便呼叫 start()方法 thread.start(); Thread thread1 = new Thread(aaa1); thread1.start(); } } class AAA implements Runnable{ private static int Num = 10000; private boolean loop = true; // public synchronized void sun(){ // if (Num<1000){ // System.out.println("餘額不足,剩餘"+Num); // loop = false; // }else { // System.out.println(Thread.currentThread().getName()+"取出1000,還剩" + (Num-=1000)); // } // } @Override public void run() { while (loop) { // sun(); synchronized (this) { if (Num < 1000) { System.out.println(Thread.currentThread().getName() +"餘額不足,剩餘" + Num); loop = false; } else { System.out.println(Thread.currentThread().getName() + "取出1000,還剩" + (Num -= 1000)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } } }
-
注意事項和細節
執行緒的死鎖
-
案例
釋放鎖
下面操作會釋放鎖
下面操作不會釋放鎖