java多線程,java多線程編程核心技術第三版pdf

本文目錄一覽:

如何深刻理解Java多線程?

線程是系統調度中的最小單位,因為其擁有比進程更小的資源消耗,因此,在進行同類事情,需要進行互相的通訊等等事情的時候,都採用線程來進行處理。

對於只做固定的一件事情(比如:計算1+2+3+…+9999999)來說,其性能上不會比採用單線程的整體效率高,原因是,同時都是要做這麼多運算,採用多線程的話,系統在進行線程調度的過程中喙浪費一些資源和時間,從而性能上下降。

那麼,多線程是否就沒有存在的意義了呢?答案當然不是的。多線程還是有存在的價值的,我們在寫輸入流輸出流,寫網路程序等等的時候,都會出現阻塞的情況,如果說,我們不使用多線程的話,從A中讀數據出來的時候,A因為沒有準備好,而整個程序阻塞了,其他的任何事情都沒法進行。如果採用多線程的話,你就不用擔心這個問題了。還舉個例子:遊戲中,如果A角色和B角色採用同一個線程來處理的話,那麼,很有可能就會出現只會響應A角色的操作,而B角色就始終被佔用了的情況,這樣,玩起來肯定就沒勁了。

因此,線程是有用的,但也不是隨便亂用,亂用的話,可能造成性能的低下,它是有一點的適用範圍的,一般我認為:需要響應多個人的事情,從設計上需要考慮同時做一些事情(這些事情很多情況下可能一點關係都沒有,也有可能有一些關係的)。

使用多線程的時候,如果某些線程之間涉及到資源共享、互相通訊等等問題的時候,一定得注意線程安全的問題,根據情況看是不是需要使用synchronized關鍵字。

多線程的java 程序如何編寫?

Java 給多線程編程提供了內置的支持。 一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。

新建狀態:

使用 new 關鍵字和 Thread 類或其子類建立一個線程對象後,該線程對象就處於新建狀態。它保持這個狀態直到程序 start() 這個線程。

就緒狀態:

當線程對象調用了start()方法之後,該線程就進入就緒狀態。就緒狀態的線程處於就緒隊列中,要等待JVM里線程調度器的調度。

運行狀態:

如果就緒狀態的線程獲取 CPU 資源,就可以執行 run(),此時線程便處於運行狀態。處於運行狀態的線程最為複雜,它可以變為阻塞狀態、就緒狀態和死亡狀態。

阻塞狀態:

如果一個線程執行了sleep(睡眠)、suspend(掛起)等方法,失去所佔用資源之後,該線程就從運行狀態進入阻塞狀態。在睡眠時間已到或獲得設備資源後可以重新進入就緒狀態。可以分為三種:

等待阻塞:運行狀態中的線程執行 wait() 方法,使線程進入到等待阻塞狀態。

同步阻塞:線程在獲取 synchronized 同步鎖失敗(因為同步鎖被其他線程佔用)。

其他阻塞:通過調用線程的 sleep() 或 join() 發出了 I/O 請求時,線程就會進入到阻塞狀態。當sleep() 狀態超時,join() 等待線程終止或超時,或者 I/O 處理完畢,線程重新轉入就緒狀態。

死亡狀態:

一個運行狀態的線程完成任務或者其他終止條件發生時,該線程就切換到終止狀態。

Java多線程是什麼意思?

1,線程的概念:線程(英語:thread)是操作系統能夠進行運算調度的最小單位。它被包含在進程之中,是進程中的實際運作單位。

2,並行與多線程。程序運行啟動了一個進程,而一個進程可以同時啟動多個線程,同時運行。

每一個線程可以執行不同的任務。

什麼是Java多線程

多線程的概念?

說起多線程,那麼就不得不說什麼是線程,而說起線程,又不得不說什麼是進程。

進程(Process)是計算機中的程序關於某數據集合上的一次運行活動,是系統進行資源分配和調度的基本單位,是操作系統結構的基礎。在早期面向進程設計的計算機結構中,進程是程序的基本執行實體;在當代面向線程設計的計算機結構中,進程是線程的容器。程序是指令、數據及其組織形式的描述,進程是程序的實體。

進程可以簡單的理解為一個可以獨立運行的程序單位。它是線程的集合,進程就是有一個或多個線程構成的,每一個線程都是進程中的一條執行路徑。

那麼多線程就很容易理解:多線程就是指一個進程中同時有多個執行路徑(線程)正在執行。

為什麼要使用多線程?

1.在一個程序中,有很多的操作是非常耗時的,如資料庫讀寫操作,IO操作等,如果使用單線程,那麼程序就必須等待這些操作執行完成之後才能執行其他操作。使用多線程,可以在將耗時任務放在後台繼續執行的同時,同時執行其他操作。

2.可以提高程序的效率。

3.在一些等待的任務上,如用戶輸入,文件讀取等,多線程就非常有用了。

缺點:

1.使用太多線程,是很耗系統資源,因為線程需要開闢內存。更多線程需要更多內存。

2.影響系統性能,因為操作系統需要在線程之間來回切換。

3.需要考慮線程操作對程序的影響,如線程掛起,中止等操作對程序的影響。

4.線程使用不當會發生很多問題。

總結:多線程是非同步的,但這不代表多線程真的是幾個線程是在同時進行,實際上是系統不斷地在各個線程之間來回的切換(因為系統切換的速度非常的快,所以給我們在同時運行的錯覺)。

2.多線程與高並發的聯繫。

高並發:高並髮指的是一種系統運行過程中遇到的一種「短時間內遇到大量操作請求」的情況,主要發生在web系統集中大量訪問或者socket埠集中性收到大量請求(例如:12306的搶票情況;天貓雙十一活動)。該情況的發生會導致系統在這段時間內執行大量操作,例如對資源的請求,資料庫的操作等。如果高並發處理不好,不僅僅降低了用戶的體驗度(請求響應時間過長),同時可能導致系統宕機,嚴重的甚至導致OOM異常,系統停止工作等。如果要想系統能夠適應高並髮狀態,則需要從各個方面進行系統優化,包括,硬體、網路、系統架構、開發語言的選取、數據結構的運用、演算法優化、資料庫優化……。

而多線程只是在同/非同步角度上解決高並發問題的其中的一個方法手段,是在同一時刻利用計算機閑置資源的一種方式。

多線程在高並發問題中的作用就是充分利用計算機資源,使計算機的資源在每一時刻都能達到最大的利用率,不至於浪費計算機資源使其閑置。

3.線程的創建,停止,常用方法介紹。

1.線程的創建:

線程創建主要有2種方式,一種是繼承Thread類,重寫run方法即可;(Thread類實現了Runable介面)

另一種則是實現Runable介面,也需要重寫run方法。

線程的啟動,調用start()方法即可。 我們也可以直接使用線程對象的run方法,不過直接使用,run方法就只是一個普通的方法了。

其他的還有: 通過匿名內部類的方法創建;實現Callable介面。。。。。

2.線程常用方法:

currentThread()方法:該方法返回當前線程的信息 .getName()可以返回線程名稱。

isAlive()方法:該方法判斷當前線程是否處於活動狀態。

sleep()方法:該方法是讓「當前正在執行的線程「休眠指定的時間,正在執行的線程是指this.currentThread()返回的線程。

getId()方法:該方法是獲取線程的唯一標識。

3.線程的停止:

在java中,停止線程並不簡單,不想for。。break那樣說停就停,需要一定的技巧。

線程的停止有3種方法:

1.線程正常終止,即run()方法運行結束正常停止。

2.使用interrupt方法中斷線程。

3.使用stop方法暴力停止線程。

interrupt方法中斷線程介紹:

interrupt方法其實並不是直接中斷線程,只是給線程添加一個中斷標誌。

判斷線程是否是停止狀態:

this.interrupted(); 判斷當前線程是否已經中斷。(判斷的是這個方法所在的代碼對應的線程,而不是調用對象對應的線程)

this.isInterrupted(); 判斷線程是否已經中斷。(誰調用,判斷誰)

註:.interrupted()與isInterrupted()的區別:

interrupted()方法判斷的是所在代碼對應的線程是否中斷,而後者判斷的是調用對象對應的線程是否停止

前者執行後有清除狀態的功能(如連續調用兩次時,第一次返回true,則第二次會返回false)

後者沒有清除狀態的功能(兩次返回都為true)

真正停止線程的方法:

異常法:

在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則 throw new interruptedException()然後捕獲該異常即可停止線程。

return停止線程:

在run方法中 使用 this.interrupted();判斷線程終止狀態,如果為true則return停止線程。 (建議使用異常法停止線程,因為還可以在catch中使線程向上拋,讓線程停止的事件得以傳播)。

暴力法:

使用stop()方法強行停止線程(強烈不建議使用,會造成很多不可預估的後果,已經被標記為過時)

(使用stop方法會拋出 java.lang.ThreadDeath 異常,並且stop方法會釋放鎖,很容易造成數據不一致)

註:在休眠中停止線程:

在sleep狀態下停止線程 會報異常,並且會清除線程狀態值為false;

先停止後sleep,同樣會報異常 sleep interrupted;

4.守護線程。

希望對您有所幫助!~

java多線程有哪些狀態?

初始態:一個線程調用了new方法之後,並在調用start方法之前的所處狀態。

就緒:一旦線程調用了start 方法,線程就轉到Runnable 狀態。

阻塞/ NonRunnable:線程處於阻塞/NonRunnable狀態,這是由兩種可能性造成的:要麼是因掛起而暫停的,要麼是由於某些原因而阻塞的,例如包括等待IO請求的完成。

停止/退出:線程轉到退出狀態,這有兩種可能性,要麼是run方法執行結束,要麼是調用了stop方法。

java 多線程是什麼?

線程定義比較抽象,簡單的說就是一個代碼執行流。許多執行流可以混合在一起由CPU調度。線程是允許各種任務交互執行的方式。

Java的線程在操作系統的實現模式依系統不同而不同,可能是系統級別的進程或線程,但對於程序員來說並沒有影響。

任務交互的一個好處是增加程序響應。如一個界面程序執行一段耗時的資料庫查詢,使用單獨的線程可以讓界面依然響應用戶的其他輸入,而單線程只能等待查詢結束再處理。

JVM以及操作系統會優先處理優先順序別高的線程,但不代表這些線程一定會先完成。設定優先順序只能建議系統更快的處理,而不能強制。

另外,在運行時,並沒有按照函數分界,而是按照機器碼/彙編碼分界。也就是說不保證任何一段代碼是被完整而不打斷的執行的(除非你已經使用同步手段)。正由於如此,各種線程同步的方法應運而生。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/187934.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-28 06:26
下一篇 2024-11-28 06:26

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python基礎教程第三版PDF下載

    熟練掌握Python編程語言可以讓你輕鬆地用代碼解決很多問題,Python基礎教程第三版是一本適合初學者的Python教程。本文將從幾個方面詳細介紹Python基礎教程第三版PDF…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29

發表回復

登錄後才能評論