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