java多線程---基礎

来源:http://www.cnblogs.com/wangxiaoce/archive/2017/02/26/6443397.html
-Advertisement-
Play Games

一, java多線程 線程與進程 進程: 程式(任務)的執行過程,擁有資源(共用記憶體,共用資源)和線程(一個或者多個,至少一個)。 例如:打開任務管理器,qq,chrome,都屬於進程。 線程: 系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。 例如:qq的聊天發送消息。 單線程:程 ...


一, java多線程----線程與進程

  進程: 程式(任務)的執行過程,擁有資源(共用記憶體,共用資源)和線程(一個或者多個,至少一個)。  例如:打開任務管理器,qq,chrome,都屬於進程。

  線程:  系統中最小的執行單元,同一進程中有多個線程,線程共用進程的資源。       例如:qq的聊天發送消息。

      單線程:程式中只有一個線程,實際上主方法就是一個主線程。

   多線程:程式中運行多個任務,   目的是更好的使用cpu資源。

二,java多線程----線程的實現

  簡單一句話來說,繼承Thead類或者實現Runnable這個介面,然後重寫裡面的run方法。

繼承Thead類

 1 public class MyThead extends Thread{
 2     
 3     private String name;
 4     public MyThead(String name) {
 5         this.name = name;
 6     }
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 1000; i++) {
10             System.out.println(name+"------"+i);
11         }
12     }
13 }

實現Runnable介面

 1 public class MyRunnable  implements Runnable{
 2     
 3     private String name;
 4     public MyRunnable(String name) {
 5         this.name = name;
 6     }
 7     @Override
 8     public void run() {
 9         for (int i = 0; i < 1000; i++) {
10             System.out.println(name+"----"+i);
11         }
12         
13     }
14 
15 }

啟動線程

 1 public class TheadDemo {
 2 
 3     public static void main(String[] args) {
 4         MyThead t1 = new MyThead("t1");
 5         MyThead t2 = new MyThead("t2");
 6         
 7         t1.start();
 8         t2.start();
 9         
10         MyRunnable r1 = new MyRunnable("r1");
11         MyRunnable r2 = new MyRunnable("r2");
12         
13         Thread t3 = new Thread(r1);
14         Thread t4 = new Thread(r2);
15         
16         t3.start();
17         t4.start();
18     }
19 }

三,java多線程----線程的狀態

   創建狀態:創建多線程對象。

   就緒狀態: 調用start(),等待cpu調用。

   運行狀態: 執行run()。

   阻塞狀態:暫時停止執行,將資源交給其他線程使用。

   終止狀態:線程結束。

四,java多線程----常用的方法(thead類裡面)

  獲取當前線程的對象      currentThread()

  得到線程名稱               getName()

  判斷線程是否運行         isAlive()

  線程的強行運行            join()      例如:倆個線程t1,t2,    當在t1執行的時候,t2調用join()方法,t1暫停不執行,t2執行,執行完成後,釋放資源,t1接著執行。

  線程的休眠                 sleep()    例如:t1每執行一次,等待5秒      t1.sleep(5000)

  線程的禮讓                 yield()     例如:倆個線程t1,t2,    當在t1執行的時候,t1調用yield()方法,t1暫停不執行,t2執行,執行完成後,釋放資源,t1接著執行。

五,java多線程---- 優先順序

  MIN_PRIORITY     小

  MAX_PRIORITY    大

  NORM_PRIORITY  正常狀態

  如果什麼都不設置,預設是5

  線程的優先順序其實可以影響線程的執行順序,這裡的影響是可能性的,有可能影響到了,也有可能沒有 。

六,java多線程----同步與死鎖

  同步的倆種方式,同步代碼塊,同步方法

  同步代碼塊格式

  synchronized( 同步的對象){

    同步的代碼

  };

  同步方法

  public synchronized void 方法名(){

    同步的代碼

  };

  例子:java代碼實現火車站三個視窗進行賣票,如果沒有同步的話,會怎麼樣,同步的話,又會出現怎麼的情空呢?

  沒有同步的代碼

  

 1 class MyRun implements Runnable{
 2     //火車站有5張票
 3     private int ticket = 5;
 4     @Override
 5     public void run() {
 6         for (int i = 0; i < 10; i++) {
 7             if(ticket > 0){
 8                 try {
 9                     Thread.sleep(500);
10                 } catch (InterruptedException e) {
11                     e.printStackTrace();
12                 }
13                 System.out.println("車票:"+ticket--);
14             }
15         }
16     }
17 }
18 public class TheadDemo {
19 
20     public static void main(String[] args) {
21         MyRun run = new MyRun();
22         Thread t1 = new Thread(run, "視窗一");
23         Thread t2 = new Thread(run, "視窗二");
24         Thread t3 = new Thread(run, "視窗三");
25         
26         t1.start();
27         t2.start();
28         t3.start();
29     }
30 }

結果; 

  

同步代碼塊實現代碼

 1 class MyRun implements Runnable{
 2     //火車站有5張票
 3     private int ticket = 5;
 4     @Override
 5     public void run() {
 6         for (int i = 0; i < 10; i++) {
 7             synchronized (this) {
 8                 if(ticket > 0){
 9                     try {
10                         Thread.sleep(500);
11                     } catch (InterruptedException e) {
12                         e.printStackTrace();
13                     }
14                     System.out.println("車票:"+ticket--);
15                 }
16             }
17         }
18     }
19 }
20 public class TheadDemo {
21 
22     public static void main(String[] args) {
23         MyRun run = new MyRun();
24         Thread t1 = new Thread(run, "視窗一");
25         Thread t2 = new Thread(run, "視窗二");
26         Thread t3 = new Thread(run, "視窗三");
27         
28         t1.start();
29         t2.start();
30         t3.start();
31     }
32 }

結果:

結論:在多線程的情況下,為了確保資源準確,或者說數據的準確,我們必須使用線程同步。也就是說加synchronized關鍵字

死鎖的概念-------所謂死鎖是指多個進 程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。

        http://c.biancheng.net/cpp/html/2604.html   可以看看該文章,裡面解釋的很清楚。

七,java多線程----線程的生命周期

    

 

 

 

  

 

  

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今天沒事,就下了個vs2015 preview,前段時間園子裡面也在熱炒這些新的語法糖,這裡我們就來看看到底都會生成些什麼樣的IL? 一:自動初始化屬性 確實這個比之前的版本簡化了一下,不過你肯定很好奇,到底編譯器給我們做了哪些東西呢? 從這張圖中可以看到,在ctor中<Name>k__backin ...
  • 1. HttpClient簡單介紹 依稀還記得那個時候用WebClient,HttpWebRequest來發送一個請求,現在ASP.NET MVC4中自帶了一個類HttpClient,用於接收HttpResponseMessage和發送HttpRequestMesssage。 問題在於既然WebCl ...
  • 參考頁面:http://qingqingquege.cnblogs.com/p/5933752.html ...
  • 簡介 ASP.NET Web API是一個可以簡化創建HTTP服務的框架 它支持包括瀏覽器和移動設備在內的各種客戶端 ASP.NET Web API是在.NET Framework上創建RESTful應用程式的理想平臺 譯者註:關於RESTful web服務可以參見這裡:http://zh.wiki ...
  • 0 Asp.Net Core 項目實戰之許可權管理系統(0) 無中生有 1 Asp.Net Core 項目實戰之許可權管理系統(1) 使用AdminLTE搭建前端 2 Asp.Net Core 項目實戰之許可權管理系統(2) 功能及實體設計 3 Asp.Net Core 項目實戰之許可權管理系統(3) 通過 ...
  • 前言 .NET Framework自2002年發佈以來,已經歷了十來個年頭。相應的,.NET平臺上的數據訪問技術也在不斷發展,從最基礎的ADO.NET,到SqlHelper簡單幫助類,到DAAB(Data Access Application Block),再到LINQ,最終演變為現在微軟主推的En ...
  • Entity Framework帶給我們的不僅僅是操作上的方便,而且使用上也很是考慮了用戶的友好交互,EF4.0與vs2010的完美融合也是我們選擇它的一個理由吧。相比Nhibernate微軟這方面做的的確是很不錯。 下麵我將使用CodeFirst方式來做個簡單是實際例子與大家分享。 我們還是和 前 ...
  • 四種引用類型的概念 強引用 StrongReference 如果一個對象具有強引用,那麼垃圾回收器絕對不會回收它,當記憶體不足時寧願拋出 OOM 錯誤,使得程式異常停止。 即是一個強引用。 軟引用 SoftReference 如果一個對象只具有軟引用,那麼垃圾回收器在記憶體充足的時候不會回收它,而在記憶體 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...