java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
一:進(jìn)程與線程
概述:幾乎任何的操作系統(tǒng)都支持運(yùn)行多個(gè)任務(wù),通常一個(gè)任務(wù)就是一個(gè)程序,而一個(gè)程序就是一個(gè)進(jìn)程。當(dāng)一個(gè)進(jìn)程運(yùn)行時(shí),內(nèi)部可能包括多個(gè)順序執(zhí)行流,每個(gè)順序執(zhí)行流就是一個(gè)線程。
進(jìn)程:進(jìn)程是指處于運(yùn)行過(guò)程中的程序,并且具有一定的獨(dú)立功能。進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)單位。當(dāng)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即為進(jìn)程。
進(jìn)程的三個(gè)特點(diǎn):
1:獨(dú)立性:進(jìn)程是系統(tǒng)中獨(dú)立存在的實(shí)體,它可以獨(dú)立擁有資源,每一個(gè)進(jìn)程都有自己獨(dú)立的地址空間,沒有進(jìn)程本身的運(yùn)行,用戶進(jìn)程不可以直接訪問(wèn)其他進(jìn)程的地址空間。
2:動(dòng)態(tài)性:進(jìn)程和程序的區(qū)別在于進(jìn)程是動(dòng)態(tài)的,進(jìn)程中有時(shí)間的概念,進(jìn)程具有自己的生命周期和各種不同的狀態(tài)。
3:并發(fā)性:多個(gè)進(jìn)程可以在單個(gè)處理器上并發(fā)執(zhí)行,互不影響。
并發(fā)性和并行性是不同的概念:并行是指同一時(shí)刻,多個(gè)命令在多個(gè)處理器上同時(shí)執(zhí)行;并發(fā)是指在同一時(shí)刻,只有一條命令是在處理器上執(zhí)行的,但多個(gè)進(jìn)程命令被快速輪換執(zhí)行,使得在宏觀上具有多個(gè)進(jìn)程同時(shí)執(zhí)行的效果
注:
線程:
線程是進(jìn)程的組成部分,一個(gè)進(jìn)程可以擁有多個(gè)線程,而一個(gè)線程必須擁有一個(gè)父進(jìn)程。線程可以擁有自己的堆棧,自己的程序計(jì)數(shù)器和自己的局部變量,但不能擁有系統(tǒng)資源。它與父進(jìn)程的其他線程共享該進(jìn)程的所有資源。
線程的特點(diǎn):
線程可以完成一定任務(wù),可以和其它線程共享父進(jìn)程的共享變量和部分環(huán)境,相互協(xié)作來(lái)完成任務(wù)。
線程是獨(dú)立運(yùn)行的,其不知道進(jìn)程中是否還有其他線程存在。
線程的執(zhí)行是搶占式的,也就是說(shuō),當(dāng)前執(zhí)行的線程隨時(shí)可能被掛起,以便運(yùn)行另一個(gè)線程。
一個(gè)線程可以創(chuàng)建或撤銷另一個(gè)線程,一個(gè)進(jìn)程中的多個(gè)線程可以并發(fā)執(zhí)行。
二、線程的創(chuàng)建及使用
java使用Thread類代表線程,所有的線程對(duì)象都必須是Thread或者其子類的實(shí)例,每個(gè)線程的作用是完成一定任務(wù),實(shí)際上是就是執(zhí)行一段程序流(一段順序執(zhí)行的代碼)
方案一:繼承Thread類創(chuàng)建線程類
步驟:① 定義Thread類的子類 并重寫該類的Run方法,該run方法的方法體就代表了該線程需要完成的任務(wù)
② 創(chuàng)建Thread類的實(shí)例,即創(chuàng)建了線程對(duì)象
③ 調(diào)用線程的start方法來(lái)啟動(dòng)線程
結(jié)論:使用繼承子Thread類的子類來(lái)創(chuàng)建線程類時(shí),多個(gè)線程無(wú)法共享線程類的實(shí)例變量(比如上面的i)
方案二:實(shí)現(xiàn)Runnable接口
①定義Runnable接口的實(shí)現(xiàn)類,并重寫它的Run方法,run方法同樣是該線程的執(zhí)行體!
②創(chuàng)建Runnable實(shí)現(xiàn)類的實(shí)例,并將此實(shí)例作為Thread的target創(chuàng)建一個(gè)Thread對(duì)象,該Thread對(duì)象才是真正的線程對(duì)象!
③調(diào)用start方法啟動(dòng)該線程
結(jié)論:采用Ruunable接口的方式創(chuàng)建多個(gè)線程可以共享線程類的實(shí)例變量,這是因?yàn)樵谶@種方式下,程序創(chuàng)建的Runnable對(duì)象只是線程的target,而多個(gè)線程可以共享一個(gè)target,所以多個(gè)線程可以共享一個(gè)實(shí)例變量
通過(guò)Runnable實(shí)現(xiàn)多線程其實(shí)就是將run包裝成線程的執(zhí)行體,但是目前java無(wú)法將任意方法包裝成線程執(zhí)行體
方案三:使用callable和future創(chuàng)建線程從Java5開始,Java提供 Callable接口,Callable接口提供了一個(gè)call()方法可以作為線程執(zhí)行體,看起來(lái)和Runnable很像,但call()方法更強(qiáng)大——call()方法可以有返回值、call()方法可以拋出異常
Java5提供了Future接口來(lái)代表Callable接口的call()方法的返回值,并為Future接口提供了一個(gè)FutureTask實(shí)現(xiàn)類,該實(shí)現(xiàn)類實(shí)現(xiàn)類Future接口,也實(shí)現(xiàn)了Runnable接口——可以作為Thread的target。
實(shí)現(xiàn)步驟:
①創(chuàng)建Callable接口的實(shí)現(xiàn)類,并實(shí)現(xiàn)call方法,該call方法會(huì)成為線程執(zhí)行體,且call方法具有返回值,在創(chuàng)建callable接口的實(shí)現(xiàn)類!
②使用FutrueTask類來(lái)包裝Callable對(duì)象,該FutrueTask封裝類Callable的call方法的返回值
③使用FutrueTask對(duì)象作為Thread的target創(chuàng)建并啟動(dòng)新線程!
④使用FutrueTask的get方法獲取執(zhí)行結(jié)束后的返回值
結(jié)論:采取Runnable、Callable的優(yōu)勢(shì)在于——線程類只是實(shí)現(xiàn)了Runnable或Callable接口,還可以繼承其它類;在這種方法下,多個(gè)線程可以共享一個(gè)target對(duì)象,因此非常適合多個(gè)相同線程處理同一份資源的情況,從而將CPU、代碼和數(shù)據(jù)分開,形參清晰的模型,體現(xiàn)了面對(duì)對(duì)象的編程思想。劣勢(shì)在于編程復(fù)雜度略高。
以上這篇java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 簡(jiǎn)述Java中進(jìn)程與線程的關(guān)系_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
- java多線程之線程,進(jìn)程和Synchronized概念初解
- Java多線程并發(fā)執(zhí)行demo代碼實(shí)例
- java高并發(fā)之理解進(jìn)程和線程
- Java多線程高并發(fā)中解決ArrayList與HashSet和HashMap不安全的方案
- java多線程之并發(fā)工具類CountDownLatch,CyclicBarrier和Semaphore
- Java的線程與進(jìn)程以及線程的四種創(chuàng)建方式
- Java并發(fā)編程之volatile與JMM多線程內(nèi)存模型
- Java多線程并發(fā)與并行和線程與進(jìn)程案例
相關(guān)文章
Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
下面這篇文章主要給大家介紹了關(guān)于Java課設(shè)案例之百行代碼實(shí)現(xiàn)簡(jiǎn)易計(jì)算器的相關(guān)資料,這是一個(gè)關(guān)于java簡(jiǎn)單計(jì)算器的完整課程設(shè)計(jì)以及源碼,需要的朋友可以參考下2023-06-06SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的項(xiàng)目實(shí)踐
現(xiàn)在電子商務(wù)平臺(tái)上訂單創(chuàng)建成功,等待支付,一般會(huì)給30分鐘的時(shí)間,本文主要介紹了SpringBoot中實(shí)現(xiàn)訂單30分鐘自動(dòng)取消的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java之Error與Exception的區(qū)別案例詳解
這篇文章主要介紹了Java之Error與Exception的區(qū)別案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問(wèn)題
這篇文章主要介紹了解決SpringBoot內(nèi)嵌Tomcat并發(fā)容量的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼
本篇文章主要介紹了Java使用NIO包實(shí)現(xiàn)Socket通信的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02RESTful?API設(shè)計(jì)原則與實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了RESTful?API設(shè)計(jì)原則與實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04如何使用ThreadLocal上下文解決查詢性能問(wèn)題
這篇文章主要介紹了利用ThreadLocal上下文解決查詢性能問(wèn)題,有兩種解決方案,一種是使用ThreadLocal上下文,另一種是使用Redis緩存,需要的朋友可以參考下2023-07-07SpringBoot實(shí)現(xiàn)配置文件自動(dòng)加載和刷新的示例詳解
在使用Spring Boot開發(fā)應(yīng)用程序時(shí),配置文件是非常重要的組成部分,在不同的環(huán)境中,我們可能需要使用不同的配置文件,當(dāng)我們更改配置文件時(shí),我們希望應(yīng)用程序能夠自動(dòng)加載和刷新配置文件,本文我們將探討Spring Boot如何實(shí)現(xiàn)配置文件的自動(dòng)加載和刷新2023-08-08