摘要:總結(jié)創(chuàng)建線程,方法運(yùn)行線程。創(chuàng)建線程使用繼承類實(shí)現(xiàn)創(chuàng)建線程文檔該類必須重寫方法。為新線程的入口點(diǎn)。中斷線程它表示一個(gè)線程被中斷,會(huì)拋出錯(cuò)誤。
java多線程
關(guān)于內(nèi)存每個(gè)線程會(huì)有自己的線程棧,即,變量不能共享,只能傳值拷貝
每個(gè)線程new出的對(duì)象全都保存在堆中,全部共享
線程具有5種狀態(tài),即新建,就緒,運(yùn)行,阻塞,死亡。
新建,當(dāng)new出來一個(gè)線程以后,jvm為其分配內(nèi)存空間,并初始化成員變量的值
就緒,當(dāng)線程調(diào)用了strat()方法的時(shí)候,線程就緒,會(huì)為其創(chuàng)建方法調(diào)用棧和程序計(jì)數(shù)器。
方法調(diào)用棧 即,記錄方法調(diào)用的次數(shù)
程序計(jì)數(shù)器 存放下一條單元指令的地方
運(yùn)行;就緒狀態(tài)獲得cpu,開始執(zhí)行run()方法
阻塞:例如進(jìn)入I/O操作
使用new關(guān)鍵字創(chuàng)建一個(gè)線程以后,該線程處于新建狀態(tài),和其他java線程一樣,僅僅由java虛擬機(jī)為其分配內(nèi)存,初始化變量成員的值。
運(yùn)行和阻塞 線程調(diào)度桌面和服務(wù)器使用搶占式調(diào)度策略,小型設(shè)備使用協(xié)作式調(diào)度策略,
線程阻塞線程使用sleep()方法主動(dòng)放棄所占用的處理器資源。
線程調(diào)用阻塞式I/O方法,方法被返回前,阻塞
線程等待通知
線程調(diào)用suspend()掛起
依依對(duì)應(yīng)即可
線程優(yōu)先級(jí)普通5,低1,高10
默認(rèn)是5
start創(chuàng)建一個(gè)線程,由于是時(shí)間片運(yùn)行的,所以需要run方法進(jìn)行運(yùn)行。
總結(jié)
start創(chuàng)建線程,run方法運(yùn)行線程。
文檔 https://docs.oracle.com/javas...
該類必須重寫run方法。為新線程的入口點(diǎn)。
必須調(diào)用start()方法才能運(yùn)行。
本質(zhì)上是Runnable接口的一種實(shí)現(xiàn)
package demo2; public class test { public static void main(String[] args) { // 創(chuàng)建一個(gè)線程 ThreadDemo run1 = new ThreadDemo(); run1.start();// 啟動(dòng)線程 // 在運(yùn)行線程以后,會(huì)不定時(shí)的jvm調(diào)用run方法,進(jìn)行運(yùn)行 } }
package demo2; public class ThreadDemo extends Thread{ public ThreadDemo() { System.out.println("hello world"); } public void run() { System.out.println("線程進(jìn)入"); for(int i = 0; i > 10; i++) { System.out.println("輸出內(nèi)容"); } System.out.println("線程執(zhí)行完畢"); } }
事實(shí)上父類的start方法也可以重寫
package demo2; public class ThreadDemo extends Thread{ public ThreadDemo() { System.out.println("hello world"); } public void run() { System.out.println("線程進(jìn)入"); for(int i = 0; i > 10; i++) { System.out.println("輸出內(nèi)容"); } System.out.println("線程執(zhí)行完畢"); } public void start() { System.out.println("啟動(dòng)線程"); this.run(); } }
然后測(cè)試類
package demo2; public class test { public static void main(String[] args) { // 創(chuàng)建一個(gè)線程 ThreadDemo run1 = new ThreadDemo(); run1.start();// 啟動(dòng)線程 } }Thread方法 public final void setDaemon(boolean on)
用于標(biāo)記守護(hù)線程和用戶線程
用戶線程,平常創(chuàng)建的普通線程
守護(hù)線程,服務(wù)于用戶線程,不需要上層調(diào)用,例如gc垃圾回收為一個(gè)明顯的守護(hù)線程,mysql中也有執(zhí)行定時(shí)任務(wù)的線程。
它表示一個(gè)線程被中斷,會(huì)拋出錯(cuò)誤。
使用Runnable接口文檔https://docs.oracle.com/javas...
屬于java.lang包內(nèi)的,為自動(dòng)默認(rèn)加載的
該接口具有一個(gè)run方法,run方法為程序的入口
必須通過Thread類的構(gòu)造方法實(shí)現(xiàn)啟動(dòng)線程
package demo2; public class test { public static void main(String[] args) { // 創(chuàng)建一個(gè)線程 demoRunnable r1 = new demoRunnable(); // 使用Thread類的構(gòu)造方法傳入線程,并起名,然后運(yùn)行 new Thread(r1, "name").start();// 創(chuàng)建完成線程以后,調(diào)用start啟動(dòng)線程 } }
package demo2; public class demoRunnable implements Runnable{ private int i; // 下方的為運(yùn)行的線程 @Override public void run() { for(int i = 0; i < 100; i++) { System.out.println("運(yùn)行線程 " + i); } } }通過Callable和Future來創(chuàng)建線程
使用Callable創(chuàng)建接口的實(shí)現(xiàn)類
接口源碼如下
@FunctionalInterface public interface Callable{ V call() throws Exception; }
實(shí)現(xiàn)了一個(gè)泛型,該并且返回該類型,需要實(shí)現(xiàn)call方法。使用包裝對(duì)象
關(guān)于包裝類型,即,將不是對(duì)象的內(nèi)容包裝成為對(duì)象,為包裝類型,實(shí)現(xiàn)了對(duì)象的類型,為一個(gè)類
先實(shí)現(xiàn)Callable接口,其中的call類為程序的子線程的執(zhí)行體
package demo2; import java.util.concurrent.Callable; public class CallableDemo implements Callable{ @Override public Integer call() throws Exception { System.out.println("開始運(yùn)行一個(gè)線程"); for(int i = 1, i < 10; i++) { System.out.println("運(yùn)行中"); } // 阻塞該線程 Thread.sleep(200); return 1; // 返回線程的值 } }
接著創(chuàng)建Future對(duì)象,將用于啟動(dòng)子線程
package demo2; import java.util.concurrent.ExecutionException; import java.util.concurrent.FutureTask; public class test { public static void main(String[] args) { // 先創(chuàng)建實(shí)例 CallableDemo ctt = new CallableDemo(); FutureTaskft = new FutureTask<>(ctt); // 該方法為了獲取返回值而設(shè)定 new Thread(ft, "返回結(jié)果的值").start(); try { System.out.println(ft.get()); } catch (InterruptedException | ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
package demo2; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; public class CallableDemo implements Callable{ @Override public Integer call() throws Exception { System.out.println("開始運(yùn)行一個(gè)線程"); for(int i = 1; i < 10; i++) { System.out.println("運(yùn)行中"); } return 1; // 返回線程的值 } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72279.html
摘要:最近聽很多面試的小伙伴說,網(wǎng)上往往是一篇一篇的多線程的文章,除了書籍沒有什么學(xué)習(xí)多線程的一系列文章。將此線程標(biāo)記為線程或用戶線程。 最近聽很多面試的小伙伴說,網(wǎng)上往往是一篇一篇的Java多線程的文章,除了書籍沒有什么學(xué)習(xí)多線程的一系列文章。但是僅僅憑借一兩篇文章很難對(duì)多線程有系統(tǒng)的學(xué)習(xí),而且面試的時(shí)候多線程這方面的知識(shí)往往也是考察的重點(diǎn),所以考慮之下決定寫一系列關(guān)于Java多線程的文章...
摘要:但是并不是什么多線程就可以隨便用,有的時(shí)候多線程反而會(huì)造成系統(tǒng)的負(fù)擔(dān),而且多線程還會(huì)造成其他的數(shù)據(jù)問題,下面就來介紹一下多線程面臨的問題。下面這張圖是多線程運(yùn)行時(shí)候的情況,我們發(fā)現(xiàn)上下文切換的次數(shù)暴增。 并發(fā)的概念: 在Java中是支持多線程的,多線程在有的時(shí)候可以大提高程序的速度,比如你的程序中有兩個(gè)完全不同的功能操作,你可以讓兩個(gè)不同的線程去各自執(zhí)行這兩個(gè)操作,互不影響,不需要執(zhí)行...
摘要:如圖所示,帶有的所有線程構(gòu)造方法都可以定義線程組的。線程組還能統(tǒng)一設(shè)置組內(nèi)所有線程的最高優(yōu)先級(jí),線程單獨(dú)設(shè)置的優(yōu)先級(jí)不會(huì)高于線程組設(shè)置的最大優(yōu)先級(jí)。 前面的文章,棧長和大家分享過多線程創(chuàng)建的3種方式《實(shí)現(xiàn) Java 多線程的 3 種方式》。 但如果線程很多的情況下,你知道如何對(duì)它們進(jìn)行分組嗎? 和 Dubbo 的服務(wù)分組一樣,Java 可以對(duì)相同性質(zhì)的線程進(jìn)行分組。 來看下線程類 Th...
摘要:線程可以被稱為輕量級(jí)進(jìn)程。一個(gè)守護(hù)線程是在后臺(tái)執(zhí)行并且不會(huì)阻止終止的線程。其他的線程狀態(tài)還有,和。上下文切換是多任務(wù)操作系統(tǒng)和多線程環(huán)境的基本特征。在的線程中并沒有可供任何對(duì)象使用的鎖和同步器。 原文:Java Multi-Threading and Concurrency Interview Questions with Answers 翻譯:并發(fā)編程網(wǎng) - 鄭旭東 校對(duì):方騰飛 多...
摘要:相比與其他操作系統(tǒng)包括其他類系統(tǒng)有很多的優(yōu)點(diǎn),其中有一項(xiàng)就是,其上下文切換和模式切換的時(shí)間消耗非常少。因?yàn)槎嗑€程競爭鎖時(shí)會(huì)引起上下文切換。減少線程的使用。很多編程語言中都有協(xié)程。所以如何避免死鎖的產(chǎn)生,在我們使用并發(fā)編程時(shí)至關(guān)重要。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)syn...
摘要:多線程環(huán)境下的一些問題安全性問題在沒有正確同步的情況下,多線程環(huán)境下程序可能得出錯(cuò)誤的結(jié)果。一些相關(guān)概念競爭條件多線程的環(huán)境下,程序執(zhí)行的結(jié)果取決于線程交替執(zhí)行的方式。而線程的交替操作順序是不可預(yù)測(cè)的,如此程序執(zhí)行的結(jié)果也是不可預(yù)測(cè)的。 入口 Java多線程的應(yīng)用復(fù)雜性之如jvm有限的幾個(gè)內(nèi)存方面的操作和規(guī)范,就像無數(shù)紛繁復(fù)雜的應(yīng)用邏輯建立在有限的指令集上。 如何寫出線程安全的程序,有...
閱讀 1071·2023-04-26 02:02
閱讀 2412·2021-09-26 10:11
閱讀 3567·2019-08-30 13:10
閱讀 3755·2019-08-29 17:12
閱讀 728·2019-08-29 14:20
閱讀 2196·2019-08-28 18:19
閱讀 2245·2019-08-26 13:52
閱讀 967·2019-08-26 13:43