日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【Java篇】多线程详解

發布時間:2024/1/1 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Java篇】多线程详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【Java】多線程基礎詳解

文章目錄

  • 【Java】多線程基礎詳解
  • 線程的相關概念
  • 一、創建線程的幾種方式
    • 1. 繼承Thread類
    • 2. 實現Runnable接口
    • 3.實現Callable接口
    • 4. 推薦使用Runnable接口
  • 二、線程安全
    • 1. 線程安全問題引入
    • 2.解決線程安全問題
    • 3. 線程中的可見性問題:
    • 運行結果顯示
    • 解決方法
    • 運行結果顯示


線程的相關概念

  • 程序:程序是含有指令和數據的文件,也可以說程序是靜態代碼,被存儲在磁盤或者其他的數據存儲設備中。
  • 進程:進程是程序執行一次的過程。進程是系統運行程序的單位,因此進程是動態的。當程序運行時就會被系統載入內存,并且啟動他的工作。對于完全不相關的程序,在同時執行時,不會做數據的交換,而且可以完全獨立運行。
  • 多任務:多任務是在一個系統中可以同時運行多個進程。每個進程都是獨立的任務,每個進程都有自己獨立的內存。所謂的同時運行進程,其實是操作系統將資源分配給各個進程以后,每個進程在CPU上交替運行。
  • 線程:線程是比進程更小的執行單位。一個進程執行過程可以產生多個線程,形成多條執行路徑,提高了運行效率。不同的是,同類的多個線程共享同一塊內存,在進行各個線程的切換時開銷比進程小很多。
  • 多線程:同時執行一個以上的線程,一個線程的執行不必等到另一個線程執行完成在執行。

提示:以下是本篇文章正文內容,下面案例可供參考

一、創建線程的幾種方式

1. 繼承Thread類

  • Thread 也是實現Runnable接口
  • 管理線程的生命周期

2. 實現Runnable接口

  • 只有一個run方法

3.實現Callable接口

  • 只有一個call方法帶有返回值

4. 推薦使用Runnable接口

  • extends 只能繼承一個類 單繼承
  • implements 可以實現多個接口 靈活
  • 繼承Thread的類創建的對象 只能調用一次start 方法啟動線程
public class ThreadTest{public static void main(String[] args){RunTest r1 = new RunTest ();Thread t2 = new Thread (r1);Thread t3 = new Thread (r1);t3.start ();t2.start ();try {t3.join ();t2.join ();} catch (InterruptedException e) {throw new RuntimeException (e);}System.out.println (r1.t);} }class RunTest implements Runnable{int t;Object o1 = new Object ();@Overridepublic void run(){// 保證原子性synchronized (o1) {for(int i = 0; i < 10000; i++){t++;}}} }

二、線程安全

1. 線程安全問題引入

  • 對于一個變量的操作: 使用 賦值 讀取 寫入 加載 上鎖 解鎖
  • 多個線程同時操作同一個變量:就會因為內存中原子操作不及時等原因導致重復(非同步操作)操作

2.解決線程安全問題

  • 保證對于這個共享資源的操作必須是原子操作
  • 對資源加鎖,操作完成之后釋放鎖
    • synchronized 關鍵字
      • 隱式鎖 加鎖與解鎖 不可代碼操作的
    • Lock接口下的鎖
      • 顯式鎖 主動的加鎖 與 解鎖
        • lock
        • unlock
  • 在鎖塊中的代碼如果出現了異常中斷,卡住
    • 導致此資源不能被釋放,一直被當前線程占用
    • 顯式鎖: 如果出現了異常,可以在finally塊中主動的釋放資源

3. 線程中的可見性問題:

  • 一個線程把資源修改了
  • 其他線程無法即時得知

(示例):對于兩個線程 t1 和 t2, 用 t2 線程來控制 t1 線程的關閉;
代碼如下:

public class ThreadTest{public static void main(String[] args){Thread1 t1= new Thread1 ();Thread2 t2= new Thread2 (t1);t1.start ();try {Thread.sleep (2000);} catch (InterruptedException e) {throw new RuntimeException (e);}t2.start ();} }class Thread1 extends Thread{boolean flag = true;@Overridepublic void run(){System.out.println ("Thread1 啟動了...");int num=0;while(flag){num++;}System.out.println ("Thread1 結束了...");} }class Thread2 extends Thread{Thread1 t1;Thread2(Thread1 t1){this.t1 = t1;}@Overridepublic void run(){System.out.println ("Thread2 啟動了...");t1.flag = false;System.out.println (" t1.flag = false; \n Thread2 結束了...");} }

運行結果顯示

t2 進程結束了,t1 進程還未結束

解決方法

用volatile關鍵字 保證線程間通信即時 (不能作為原子操作的標準)
代碼如下:

public class ThreadTest{public static void main(String[] args){Thread1 t1= new Thread1 ();Thread2 t2= new Thread2 (t1);t1.start ();try {Thread.sleep (2000);} catch (InterruptedException e) {throw new RuntimeException (e);}t2.start ();} }class Thread1 extends Thread{volatile boolean flag = true;@Overridepublic void run(){System.out.println ("Thread1 啟動了...");int num=0;while(flag){num++;}System.out.println ("Thread1 結束了...");} }class Thread2 extends Thread{Thread1 t1;Thread2(Thread1 t1){this.t1 = t1;}@Overridepublic void run(){System.out.println ("Thread2 啟動了...");t1.flag = false;System.out.println (" t1.flag = false; \n Thread2 結束了...");} }

運行結果顯示

t2進程結束后,t1進程也結束了。

總結

以上是生活随笔為你收集整理的【Java篇】多线程详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。