1.0 高併發之線程和進程

来源:https://www.cnblogs.com/Smileing/archive/2018/12/03/10057169.html
-Advertisement-
Play Games

一、多線程 1、1 線程與進程區別 進程:每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。 線程:線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行。 總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑。多線程的好處是可以提高程式的效率。 一個應用系統可以多個 ...


一、多線程

1、1 線程與進程區別

  進程:每個正在系統上運行的程式都是一個進程。每個進程包含一到多個線程。

  線程:線程是一組指令的集合,或者是程式的特殊段,它可以在程式里獨立執行

總結:進程是所有線程的集合,每一個線程是進程中的一條執行路徑多線程的好處是可以提高程式的效率

一個應用系統可以多個進程:進程中一定有一個主線程(JAVA中Main函數)。線程是一個進程執行順序,流程,路徑,並且每個線程不影響。

1、2 生活中實例:

迅雷種子多個下載,買票系統,應用系統,Ajax非同步上傳

1、3 實現多線程的方式

  同步執行:單線程(同一時刻只能執行一個方法,時間相加)

  非同步執行:多線程(同一時刻同時執行多個方法,不相互影響,時間隨最後執行完時間結束)

    實現Runnable介面比繼承Thread類好,因為介面可以多繼承。

 

  開始執行線程  開啟線程不是調用run方法,而是start方法

  創建方法:    1、第一種繼承Thread類 重寫run方法、範例代碼:註意 開啟線程不是調用run方法,而是start方法

package com.lele.JavaAll1203Test;

/**
* @author LIULE
* @version v0.1
* @classDesc 創建多線程例子(重寫Thread的run方法)
*/
class CreateThrea extends Thread{
public void run(){
for( int i = 0;i<=200;i++){
System.out.println("i的值為"+i);
}
}
}
public class Test01Threath {
public static void main(String[]args){
System.out.println("多線程createThread開始");
CreateThrea t = new CreateThrea();
System.out.println("開始執行多線程");
t.start();
for( int i = 0;i<=200;i++){
System.out.println("MAIN"+i);
}
System.out.println("多線程createThread結束");
}
}

 

2、實現Runnable介面,重寫run方法,代碼範例

/**
* @author LIULE
* @version v0.1
* @classDesc 創建多線程例子(實現Runnable介面
*/
public class Test02Runnable {
public static void main(String[]args){
System.out.println("創建一個多線程---");
creatRunnable c = new creatRunnable();
System.out.println("多線程開始調用---");
Thread thread = new Thread(c);
thread.start();
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的主方法的值為"+i);
}
System.out.println("多線程調用結束--");
}

}
class creatRunnable implements Runnable{
@Override
public void run(){
for(int i = 0 ; i <= 200 ;i++ ){
System.out.println("i的子線程值為"+i);
}
}
}

 3、使用匿名內部類

public class Test03InNoname {
public static void main(String[]args){
System.out.println("多線程開始");
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
for ( int i = 0; i < 20;i++){
System.out.println("內部子線程i"+i);
}
}
});
thread.start();
for ( int i = 0; i < 20;i++){
System.out.println("內部主線程i"+i);
}
}
}

線程常用API的方法:

start()啟動線程

currentThread()獲取當前線程對象

getID()獲取當前線程ID      Thread-編號  該編號從0開始

getName()獲取當前線程名稱

sleep(long mill)休眠線程

Stop()停止線程,(不安全,已不使用)

二、守護線程

Java中有兩種線程,一種是用戶線程(非守護線程,用戶線程是指用戶自定義創建的線程,主線程停止,用戶線程不會停止)

另一種是守護線程(和主線程一起銷毀GC回收線程)。守護線程當進程不存在或主線程停止,守護線程也會被停止。

使用setDaemon(true)方法設置為守護線程

三、多線程狀態

  線程從創建、運行到結束總是處於下麵五個狀態之一:新建狀態(ew Thread(r))、就緒狀態(start()方法)、運行狀態(真正開始執行run()方法)、

  阻塞狀態    線程運行過程中,可能由於各種原因進入阻塞狀態:

        1>線程通過調用sleep方法進入睡眠狀態;

        2>線程調用一個在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會返回到它的調用者;

        3>線程試圖得到一個鎖,而該鎖正被其他線程持有;

        4>線程在等待某個觸發條件;

死亡狀態,需要使用isAlive方法

   1) run方法正常退出而自然死亡,

     2) 一個未捕獲的異常終止了run方法而使線程猝死。

四、JOIN方法

join作用是讓其他線程變為等待,

t1.join();// 讓其他線程變為等待,直到當前t1線程執行完畢,才釋放。

thread.Join把指定的線程加入到當前線程,可以將兩個交替執行的線程合併為順序執行的線程。比如線上程B中調用了線程A的Join()方法,直到線程A執行完畢後,才會繼續執行線程B。join方法寫在相應的下一個執行的方法中。


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

-Advertisement-
Play Games
更多相關文章
  • 值傳遞: (形式參數類型是基本數據類型和String):方法調用時,實際參數把它的值傳遞給對應的形式參數,形式參數只是用實際參數的值初始化自己的存儲單元內容,是兩個不同的存儲單元,所以方法執行中形式參數值的改變不影響實際參數的值。 引用傳遞: (形式參數類型是引用數據類型參數除去String):也稱 ...
  • 學習Java一年多了,練習了很多,這條路真的很難走.還有半年多畢業的我整理整理所學習的筆記給大家分享主要也是讓自己記憶加深.自學時用到的時阿發老師的教學視頻,通俗易懂還有題庫可以練習.最經典的就是阿發老師會教你如何開發車而不是使用車.筆記中的截圖和源碼都是老師的.這次整理主要是給自己看的,有需要的朋 ...
  • 《工作細胞》最近比較火,bilibili 上目前的短評已經有17000多條。 先看分析下頁面 右邊 li 標簽中的就是短評信息,一共20條。一般我們載入大量數據的時候,都會做分頁,但是這個頁面沒有,只有一個滾動條。 隨著滾動條往下拉,信息自動載入了,如下圖,變40條了。由此可見,短評是通過非同步載入的 ...
  • 因為工作中慢慢開始用python的協程,所以想更好的理解一下實現方式,故翻譯此文 原文中把辭彙表放到最後,但是我個人覺得放在最開始比較好,這樣可以增加當你看原文時的理解程度 辭彙表 原生協程函數 Native coroutine function: 由async def定義的協程函數,可以使用awa ...
  • 只使用Spring的時候,我把applicationContext.xml是放在項目的src路徑下的,這樣使用ClassPathXmlApplicationContext很方便嘛 整合了struts之後,就讀取不到這個配置文件了,因為Spring會到WEB-INF下來找配置文件, Spring配置文 ...
  • 1.線程列隊 queue隊列 :使用import queue,用法與進程Queue一樣 class queue.Queue(maxsize=0) 1 # 先進先出: 2 q = queue.Queue(3) # 也可以不加數字表示不限 3 q.put('約嗎') 4 q.put('你個糟老頭') 5 ...
  • 題意 "題目鏈接" 求滿足$i^2 + j^2 \% M = 0$的數對$(i, j)$的個數,$1 \leqslant i, j \leqslant 10^9, M \leqslant 1000$ Sol 發這篇博客的目的就是為了證明一下我到底有多菜。 mdzz小學組水題我想了40min都沒想出來 ...
  • 首先我們來講講我們python中的可變對象和不可變對象: 可變對象:該對象指向記憶體中的值是可以改變的。實際上是其所指的值直接發生改變,而不是發生複製,或者開闢一個新的地址空間。例如:列表list,字典dict,集合set。 不可變對象:該對象所指向的記憶體中的值是不能被改變的。當改變一個變數時,由於其 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...