1. 程式人生 > 資訊 >馬斯克:如果特斯拉 FSD Beta v10.11 表現好,考慮降低參測最低安全分要求

馬斯克:如果特斯拉 FSD Beta v10.11 表現好,考慮降低參測最低安全分要求

多執行緒基礎

  • 程序:程序就是執行中的程式,當被關閉的時候,這段程序也關閉。比如我們玩玩遊戲,開啟遊戲作業系統會為該程序分配一個空間,當退出遊戲是,程序也就結束了
  • 執行緒:執行緒是由程序建立的,是程序的實體。比如我們下載東西,可以同時下載幾個,下載一個就開啟一個執行緒。再比如,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();
                    }
                }
            }
        }
    }
}
  •  注意事項和細節

 

 

執行緒的死鎖

 

  • 案例

 

釋放鎖

下面操作會釋放鎖

 

 

下面操作不會釋放鎖