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

執行緒的死鎖

-
案例

釋放鎖
下面操作會釋放鎖

下面操作不會釋放鎖

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/445498.html
標籤:其他
