當前位置:首頁 » 編程語言 » java線程詳解

java線程詳解

發布時間: 2022-08-16 04:43:25

java中,線程是什麼意思,多線程又是什麼

在計算機中當一個程序運行的時候就會創建至少一個進程,例如當我們運行QQ的時候,系統就會創建進程來處理我們平時的一些操作,當我們打開任務管理器的時候,在進程的列表裡面就可以找到QQ.exe的運行程序;

在計算機中處理進程之外還有另一個概念就是線程,線程是存在於進程當中,一個進程可以包含多個線程;當我們的計算機有多核處理器的時候,使用多線程可以加快程序的運算速率;如果一個進程中只有一個線程,當程序遇到一個比較耗時的計算的時候,由於程序是單線程的,那麼程序只能等待這個運算結束的時候再繼續運行,這樣會大大的降低程序的效率;當時用多個線程的時候,在某個線程遇到比較耗時的運算的時候,該線程可以繼續自己的運算,但是其他的線程也可以同步進行,這樣當耗時的計算結束之後,其他線程也將自己所需要的東西執行完畢,這樣就會很大的提高程序執行效率;

在程序運行中對於文件的保存相對於處理器的運算速度來說是很慢的,當我們程序中接收到一個保存文件的信息之後,我們可以創建一個保存文件的線程,在主線程中我們可以繼續進行我們的其他運算,這樣當文件保存好之後,我們的其他運算也會完成,互不影響;

在Java中我們可以創建一個自己的類繼承於Thread類,並且重寫run() 方法,當線程啟動之後,run()方法裡面的操作都在線程中進行處理,而不會影響主線程的信息;

當我們創建好一個自定義線程類之後,我們可以創建這個自定義線程的對象,進行線程的啟動;線程須調用start();方法進行啟動,這樣run()方法裡面的內容才會在線程中運行;如果我們不去調用start()方法,那我們只是創建了一個普通的類,即使我們手動調用run()方法,run()方法裡面的內容也不會在線程中運行;

在Java中線程主要有初始狀態,運行狀態,阻塞狀態,終止狀態等;當我們新創建一個線程對象的時候,此時線程的狀態為初始狀態;當我們調用start()之後,此時的線程才被激活成為運行狀態,之後run()方法裡面的信息才會在子線程中運行;我們可以在不同的階段調用不同的方法將線程設置為不同的狀態;比如有時候我們的操作需要等待其他線程中運算結束之後才可以繼續進行,這時候我們就可以將線程設置為等待狀態,當需要的資源滿足條件之後,可以繼續運行當前的線程;

以上的內容就是關於Java中線程是什麼,更多關於Java方面的問題可以看下這個視頻教程:網頁鏈接,希望我的回答能幫到你。

② java中Thread線程問題

線程有兩種,一種是繼承Thread的
另一種是使用Runnable介面的
兩種區別是Runnable內的成員變數是共享的
你將extends Thread 改成implements Runnable
或者將ticket改為public static 就不會出現負數的效果

③ java常用的幾種線程池實例講解

下面給你介紹4種線程池:

1、newCachedThreadPool:

  • 底層:返回ThreadPoolExecutor實例,corePoolSize為0;maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為60L;unit為TimeUnit.SECONDS;workQueue為SynchronousQueue(同步隊列)

  • 通俗:當有新任務到來,則插入到SynchronousQueue中,由於SynchronousQueue是同步隊列,因此會在池中尋找可用線程來執行,若有可以線程則執行,若沒有可用線程則創建一個線程來執行該任務;若池中線程空閑時間超過指定大小,則該線程會被銷毀。

  • 適用:執行很多短期非同步的小程序或者負載較輕的伺服器

2、newFixedThreadPool:


  • 底層:返回ThreadPoolExecutor實例,接收參數為所設定線程數量nThread,corePoolSize為nThread,maximumPoolSize為nThread;keepAliveTime為0L(不限時);unit為:TimeUnit.MILLISECONDS;WorkQueue為:new LinkedBlockingQueue<Runnable>()無解阻塞隊列

  • 通俗:創建可容納固定數量線程的池子,每隔線程的存活時間是無限的,當池子滿了就不在添加線程了;如果池中的所有線程均在繁忙狀態,對於新任務會進入阻塞隊列中(無界的阻塞隊列)

  • 適用:執行長期的任務,性能好很多

3、newSingleThreadExecutor

  • 底層:包裝的ThreadPoolExecutor實例,corePoolSize為1;maximumPoolSize為1;keepAliveTime為0L;unit為:TimeUnit.MILLISECONDS;workQueue為:new LinkedBlockingQueue<Runnable>()無解阻塞隊列

  • 通俗:創建只有一個線程的線程池,且線程的存活時間是無限的;當該線程正繁忙時,對於新任務會進入阻塞隊列中(無界的阻塞隊列)

  • 適用:一個任務一個任務執行的場景

4、NewScheledThreadPool:

  • 底層:創建ScheledThreadPoolExecutor實例,corePoolSize為傳遞來的參數,maximumPoolSize為Integer.MAX_VALUE;keepAliveTime為0;unit為:TimeUnit.NANOSECONDS;workQueue為:new DelayedWorkQueue()一個按超時時間升序排序的隊列

  • 通俗:創建一個固定大小的線程池,線程池內線程存活時間無限制,線程池可以支持定時及周期性任務執行,如果所有線程均處於繁忙狀態,對於新任務會進入DelayedWorkQueue隊列中,這是一種按照超時時間排序的隊列結構

  • 適用:周期性執行任務的場景

最後給你說一下線程池任務執行流程:

  • 當線程池小於corePoolSize時,新提交任務將創建一個新線程執行任務,即使此時線程池中存在空閑線程。

  • 當線程池達到corePoolSize時,新提交任務將被放入workQueue中,等待線程池中任務調度執行

  • 當workQueue已滿,且maximumPoolSize>corePoolSize時,新提交任務會創建新線程執行任務

  • 當提交任務數超過maximumPoolSize時,新提交任務由RejectedExecutionHandler處理

  • 當線程池中超過corePoolSize線程,空閑時間達到keepAliveTime時,關閉空閑線程

  • 當設置allowCoreThreadTimeOut(true)時,線程池中corePoolSize線程空閑時間達到keepAliveTime也將關閉

④ Java Thread案例詳解sleep和wait的區別

sleep()使當前線程進入停滯狀態(阻塞當前線程),讓出CUP的使用、目的是不讓當前線程獨自霸佔該進程所獲的CPU資源,以留一定時間給其他線程執行的機會;
sleep()是Thread類的Static(靜態)的方法;因此他不能改變對象的機鎖,所以當在一個Synchronized塊中調用Sleep()方法是,線程雖然休眠了,但是對象的機鎖並木有被釋放,其他線程無法訪問這個對象(即使睡著也持有對象鎖)。
在sleep()休眠時間期滿後,該線程不一定會立即執行,這是因為其它線程可能正在運行而且沒有被調度為放棄執行,除非此線程具有更高的優先順序。

⑤ 如何分析java thread mp

thread mp解析
頭部信息
時間,jvm信息

{code}
2011-11-02 19:05:06
Full thread mp Java HotSpot(TM) Server VM (16.3-b01 mixed mode):
{code}
線程info信息塊
{code}
"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object)
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object)
at java.lang.Thread.run(Thread.java:619)
{code}

"Checkpointer" daemon prio=10 tid=0x68ce1c00 nid=0x7c11 in Object.wait() [0x68b5c000]

* 線程名稱:Checkpointer
* 線程類型:daemon
* 優先順序:10,默認是5
* jvm線程id:jvm內部線程的唯一標識,0x68ce1c00
* 對應系統線程id:和top命令查看的pid對應,不過一個是10進制,一個是16進制。0x7c11
* 線程狀態:Object.wait().
* 起始棧地址
線程狀態詳解
Runnable
_The thread is either running or ready to run when it gets its CPU turn._
不解釋。

Wait on condition
_The thread is either sleeping or waiting to be notified by another thread._
該狀態出現在線程等待某個條件的發生或者sleep。
_最常見的情況是線程在等待網路的讀寫,比如當網路數據沒有準備好讀時,線程處於這種等待狀態,而一旦有數據准備好讀之後,線程會重新激活,讀取並處理數據。_

Waiting for Monitor Entry and in Object.wait()
_The thread is waiting to get the lock for an object (some other thread may be holding the lock). This happens if two or more threads try to execute synchronized code. Note that the lock is always for an object and not for indivial methods._
當一個線程申請進入臨界區時,獲取到monitor,線程將處於 「Runnable」的狀態,否則,線程 DUMP會顯示處於 「waiting for monitor entry」。
當線程獲得了 Monitor,進入了臨界區之後,如果發現線程繼續運行的條件沒有滿足,它則調用對象(一般就是被 synchronized 的對象)的 wait() 方法,放棄了 Monitor,進入 「Wait Set」隊列。只有當別的線程在該對象上調用了 notify() 或者 notifyAll() , 「 Wait Set」隊列中線程才得到機會去競爭,但是只有一個線程獲得對象的 Monitor,恢復到運行態。在 「Wait Set」中的線程, DUMP中表現為: in Object.wait()。
例:

<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff6666;">{code}
"Timer-0" daemon prio=10 tid=0x695c3000 nid=0x7c00 in Object.wait() [0x69468000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x744f2850> (a java.util.TaskQueue) ###繼續wait
at java.util.TimerThread.mainLoop(Timer.java:509)
- locked <0x744f2850> (a java.util.TaskQueue) ###已經lock到0x744f2850
at java.util.TimerThread.run(Timer.java:462)
{code}</span></span>
參見:http://jameswxx.iteye.com/blog/1041173

{code}
java.lang.Thread.State: WAITING (on object monitor)
<p style="margin-top: 4px; margin-right: 0px; margin-bottom: 4px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; ">{code}</p>
線程狀態運行:
WAITING||State || Description||
|blocked|This thread tried to enter a synchronized block, but the lock was taken by another thread. This thread is blocked until the lock gets released.|
|blocked (on thin lock)|This is the same state as blocked, but the lock in question is a thin lock.||waiting|This thread called Object.wait() on an object. The thread will remain there until some other thread sends a notification to that object.|
|sleeping|This thread called java.lang.Thread.sleep().||parked|This thread called java.util.concurrent.locks.LockSupport.park().||suspended|The thread's execution was suspended by java.lang.Thread.suspend() or a JVMTI agent call.|
{code}
at java.lang.Object.wait(Native Method)
- waiting on <0x740ad988> (a java.lang.Object) ###等待堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Object.wait(Object.java:485)
at com.sleepycat.je.utilint.DaemonThread.run(DaemonThread.java:163)
- locked <0x740ad988> (a java.lang.Object) ###hold住堆地址為0x740ad988的java.lang.Object對象的鎖
at java.lang.Thread.run(Thread.java:619)
{code}

⑥ java學習作為一名java初學者,如何快速學習j

那首先來了解一下什麼是java:

Java是SUN(Stanford University Network,斯坦福大學網路公司)1995年推出的一門高級編程語言,是一種面向Internet的編程語言。隨著Java技術在web方面的不斷成熟,已經成為Web應用程序的首選開發語言。

那麼為什麼要使用這個語言呢,Java語言的特點跨平台性,通過Java語言編寫的應用程序在不同的系統平台上都可以運行。原理是只要在需要運行java應用程序的操作系統上,先安裝一個Java虛擬機(JVM Java Virtual Machine)即可。由JVM來負責Java程序在該系統中的運行。

下面對java學習進行一次史無前例的剖析,細致的講解零基礎的人怎麼學習Java。先看下Java在基礎階段的知識點路線圖。

⑦ 什麼是java多線程詳解

線程對象是可以產生線程的對象。比如在Java平台中Thread對象,Runnable對象。線程,是指正在執行的一個指點令序列。在java平台上是指從一個線程對象的start()開始,運行run方法體中的那一段相對獨立的過程。相比於多進程,多線程的優勢有:
(1)進程之間不能共享數據,線程可以;
(2)系統創建進程需要為該進程重新分配系統資源,故創建線程代價比較小;
(3)Java語言內置了多線程功能支持,簡化了java多線程編程。
一、創建線程和啟動
(1)繼承Thread類創建線程類
通過繼承Thread類創建線程類的具體步驟和具體代碼如下:
• 定義一個繼承Thread類的子類,並重寫該類的run()方法;
• 創建Thread子類的實例,即創建了線程對象;
• 調用該線程對象的start()方法啟動線程。
復制代碼
class SomeThead extends Thraad {
public void run() {
//do something here
}
}

public static void main(String[] args){
SomeThread oneThread = new SomeThread();
步驟3:啟動線程:
oneThread.start();
}
復制代碼
(2)實現Runnable介面創建線程類
通過實現Runnable介面創建線程類的具體步驟和具體代碼如下:
• 定義Runnable介面的實現類,並重寫該介面的run()方法;
• 創建Runnable實現類的實例,並以此實例作為Thread的target對象,即該Thread對象才是真正的線程對象。
復制代碼
class SomeRunnable implements Runnable {
public void run() {
//do something here
}
}
Runnable oneRunnable = new SomeRunnable();
Thread oneThread = new Thread(oneRunnable);
oneThread.start();
復制代碼
(3)通過Callable和Future創建線程
通過Callable和Future創建線程的具體步驟和具體代碼如下:
• 創建Callable介面的實現類,並實現call()方法,該call()方法將作為線程執行體,並且有返回值。
• 創建Callable實現類的實例,使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值。
• 使用FutureTask對象作為Thread對象的target創建並啟動新線程。
• 調用FutureTask對象的get()方法來獲得子線程執行結束後的返回值其中,Callable介面(也只有一個方法)定義如下:
復制代碼
public interface Callable {
V call() throws Exception;
}
步驟1:創建實現Callable介面的類SomeCallable(略);
步驟2:創建一個類對象:
Callable oneCallable = new SomeCallable();
步驟3:由Callable創建一個FutureTask對象:
FutureTask oneTask = new FutureTask(oneCallable);
注釋: FutureTask是一個包裝器,它通過接受Callable來創建,它同時實現了 Future和Runnable介面。
步驟4:由FutureTask創建一個Thread對象:
Thread oneThread = new Thread(oneTask);
步驟5:啟動線程:
oneThread.start();

⑧ 如何掌握java多線程,高並發,大數據方面的技能

總是看見有部分sb要回答你不能好好回答。不知道你丫能不能閉嘴?
多線程+並發,看java並發編程詳解,90%以上會java多線程的程序員都從這本書上學的。要考慮高並發,深刻理解多線程,並發,只有java的知識不夠,需要看操作系統核心編程之類的書籍,前提得會c編寫邊做邊理解。操作系統底層給它扒個底朝天。java的多線程是基於操作系統的,換句話說java的多線程依賴操作系統的多線程實現。操作系統核心編程(windows)或操作系統高級編程(unix系的)會把操作系統的運行原理說得很透徹,當然包括線程。
除了上面的知識,還需要深刻了解tcp/ip協議以及套接字編程,以及常用的tcp,udp,sctp的應用,如http,ftp,smtp,pop3,rpc等等應用級協議。
大數據需要資料庫支撐,資料庫的先會吧!這個一班不重要。大數據著塊重要的功能是如何,使用分析海量數據提取有用信息。需要針對不同領域做分析使用。比如一個氣象數據,對賣空調、賣冰箱的人他們關心啥,要能提供對應的數據給他們。對賣服裝的人,他們又關心啥?要提供哪些數據給他們?對農名,他們又關心啥,要提供哪些數據給他們?說大底。大數據所關心的問題是如何提供有效服務(掙錢點),需要了解很多具體行業知識。
(處理大數據的程序,略過,真不是太難的事,你學得懂第二,第三段描述的內容,要理解大數據的一些代碼架構實現不難)

⑨ java多線程/磁碟IO過程詳解:為什麼說多線程

磁碟IO的速度在那裡了,就算你再多的線程,也繞不過IO瓶頸。不是說多線程不能提高效率,這個要看你項目的性能瓶頸在哪裡。 IO密集型,沒必要多線程,容易弄巧成拙。建議Cache,某些文件系統在順序讀或寫磁碟時速度相當快,如果恰好文件是順序存儲在磁碟上的,建議先盡量讀進內存,再一次性寫出去。其他什麼磁碟內存通道之類的底層技術就不是Java能左右的了。

⑩ 如何分析JAVA 線程堆棧

itjobJava老師講過:1) 線程堆棧概述及基礎知識
2) 線程堆棧的生成原理以及相關工具
3) 不同JVM線程堆棧的格式的差異(Sun HotSpot、IBM JRE、Oracal JRockit)
4) 線程堆棧日誌介紹以及解析方法
5) 線程堆棧的分析和相關的技術
6) 常見的問題模板(線程竟態、死鎖、IO調用掛死、垃圾回收/OutOfMemoryError問題、死循環等)
7) 線程堆棧問題實例分析
我希望這一系列的培訓能給你帶來確實的幫助,所以請持續關注每周的文章更新。
但是如果我在學習過程中有疑問或者無法理解文章中的內容該怎麼辦?
不用擔心,把我當做你的導師就好。任何關於線程堆棧的問題都可以咨詢我(前提是問題不能太low)。請隨意選擇下面的幾種方式與我取得聯系:
1) 直接本文下面發表評論(不好意思的話可以匿名)
2) 將你的線程堆棧數據提交到Root Cause Analysis forum
3) 發Email給我,地址是 @[email protected]
能幫我分析我們產品上遇到的問題么?
當然可以,如果你願意的話可以把你的堆棧現場數據通過郵件或論壇 Root Cause Analysis forum發給我。處理實際問題是才是學習提升技能的王道。
我真心期望大家能夠喜歡這個培訓。所以我會盡我所能去為你提供高質量的材料,並回答大家的各種問題。
在介紹線程堆棧分析技術和問題模式之前,先要給大家講講基礎的內容。所以在這篇帖子里,我將先覆蓋到最基本的內容,這樣大家就能更好的去理解JVM、中間件、以及Java EE容器之間的交互。
Java VM 概述
Java虛擬機是Jave EE 平台的基礎。它是中間件和應用程序被部署和運行的地方。
JVM向中間件軟體和你的Java/Java EE程序提供了下面這些東西:
– (二進制形式的)Java / Java EE 程序運行環境
– 一些程序功能特性和工具 (IO 基礎設施,數據結構,線程管理,安全,監控 等等.)
– 藉助垃圾回收的動態內存分配與管理
你的JVM可以駐留在許多的操作系統 (Solaris, AIX, Windows 等等.)之上,並且能根據你的物理伺服器配置,你可以在每台物理/虛擬伺服器上安裝1到多個JVM進程.
JVM與中間件之間的交互
下面這張圖展示了JVM、中間件和應用程序之間的高層交互模型。
如你所見,標准Java EE應用程序的線程的分配實在中間件內核與JVM之間完成的。(當然也有例外,應用程序可以直接調用API來創建線程,這種做法並不常見,而且在使用的過程中也要特別的小心)
同時,請注意一些線程是由JVM內部來進行管理的,典型的例子就是垃圾回收線程,JVM內部使用這個線程來做並行的垃圾回收處理。
因為大多數的線程分配都是由Java EE容器完成的,所以能夠理解和認識線程堆棧跟蹤,並能從線程堆棧數據中識別出它來,對你而言很重要. 這可以讓你能夠快速的知道Java EE容器正要執行的是什麼類型的請求.
從一個線程轉儲堆棧的分析角度來看,你將能了解從JVM發現的線程池之間的不同,並識別出請求的類型.
最後一節會向你提供對於HotSop VM而言什麼是JVM線程堆棧的一個概述,還有你將會遇到的各種不同的線程. 而對 IBM VM 線程堆棧形式詳細內容將會在第四節向你提供.
請注意你可以從根本原因分析論壇獲得針對本文的線程堆棧示例.
JVM 線程堆棧——它是什麼?
JVM線程堆棧是一個給定時間的快照,它能向你提供所有被創建出來的Java線程的完整清單.

熱點內容
壓縮段的作 發布:2025-01-20 07:04:13 瀏覽:378
安卓studio字體如何居中 發布:2025-01-20 07:04:13 瀏覽:151
edge瀏覽器無法訪問 發布:2025-01-20 06:52:57 瀏覽:330
c語言inline函數 發布:2025-01-20 06:45:43 瀏覽:747
安卓手機如何把鎖屏時間去掉 發布:2025-01-20 06:34:16 瀏覽:435
linux卸載jdk17 發布:2025-01-20 06:33:29 瀏覽:231
猿編程使用 發布:2025-01-20 06:17:58 瀏覽:453
編譯lichee 發布:2025-01-20 06:16:33 瀏覽:157
f5演算法 發布:2025-01-20 06:11:39 瀏覽:256
吃雞游戲伺服器被鎖怎麼辦 發布:2025-01-20 06:04:21 瀏覽:176