摘要:方法返回當前線程的構(gòu)造方法執(zhí)行結(jié)果構(gòu)造方法在初始化的過程中都是在主線程執(zhí)行,后開啟新線程執(zhí)行。方法是事當前線程睡眠暫停毫秒。在睡眠過程中,線程會讓出,但不會失去已鎖定的資源。
上文介紹了Tread的實例方法,本文再介紹下Thread的靜態(tài)方法。
currentThread()currentThread方法返回當前線程的Object
public class Thread1 extends Thread{ static{ System.out.println(Thread.currentThread().getName()+" --> static"); } public Thread1() { System.out.println(Thread.currentThread().getName()+" --> 構(gòu)造方法"); } @Override public void run() { System.out.println(Thread.currentThread().getName()+" --> run"); } }
public static void main(String[] args) { Thread1 t1 = new Thread1(); t1.start(); }
執(zhí)行結(jié)果:
main --> static main --> 構(gòu)造方法 Thread-0 --> run
Thread1在初始化的過程中都是在主線程執(zhí)行,start后開啟新線程執(zhí)行。
sleep()sleep方法是事當前線程睡眠(暫停)n毫秒。在睡眠過程中,線程會讓出cpu,但不會失去已鎖定的資源。
Thread t = new Thread(new Runnable() { @Override public void run() { try { Long t1 = System.currentTimeMillis(); System.out.println("start at:"+t1); Thread.sleep(2000); Long t2 = System.currentTimeMillis(); System.out.println("end at:"+t2); } catch (InterruptedException e) { e.printStackTrace(); } } }); t.start();
執(zhí)行結(jié)果:
start at:1511096714406 end at:1511096716407
考慮到系統(tǒng)時間分配等因素,執(zhí)行結(jié)果都會大于等于指定的毫秒數(shù),但不會差太多。另外sleep方法會拋出InterruptedException 的異常,在上文中也有講到。
yield()yield方法是讓出cpu的使用,讓出多少時間是不確定的。
public class YieldTest extends Thread{ public YieldTest(String name) { super(name); } @Override public void run() { for (int i = 1; i <= 50; i++) { System.out.println("" + this.getName() + "-----" + i); if (i == 30) { this.yield(); } } } public static void main(String[] args) { YieldTest yt1 = new YieldTest("張三"); YieldTest yt2 = new YieldTest("李四"); yt1.start(); yt2.start(); } }
部分的執(zhí)行結(jié)果:
...... 張三-----28 張三-----29 張三-----30 李四-----17 李四-----18 李四-----19 李四-----20 .....
當然每次執(zhí)行的結(jié)果可能都不一樣,這里可以看在執(zhí)行到i==30時,"張三"讓出了cpu使用,"李四"則開始執(zhí)行。
interrupted()返回當前線程是否被中斷,實現(xiàn)就是
return currentThread().isInterrupted(true);holdsLock(Object obj)
holdsLock是判斷某個資源是否被線程鎖定,
public class Thread1 extends Thread{ private Object obj = new Object(); @Override public void run() { synchronized (obj) { System.out.println("holdsLock1="+Thread.holdsLock(obj)); } System.out.println("holdsLock2="+Thread.holdsLock(obj)); } }
public static void main(String[] args) { Thread1 t1 = new Thread1(); t1.start();
執(zhí)行結(jié)果:
holdsLock1=true holdsLock2=false
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70667.html
摘要:程序執(zhí)行時,至少會有一個線程在運行,這個運行的線程被稱為主線程。程序的終止是指除守護線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運行...
摘要:同步代碼塊二類,鎖是小括號中的類對象對象。因為對于同一個實例對象,各線程之間訪問其中的同步方法是互斥的。優(yōu)化同步代碼塊的方式有,減少同步區(qū)域或減小鎖的范圍。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多線程編程中,我們常需要考慮線程安全問題,其中關(guān)鍵字 synchro...
摘要:非靜態(tài)方法以及方法內(nèi)部的代碼塊持有的是同一個對象鎖,它們是同步執(zhí)行的。可重入鎖使用時,當一個線程請求一個對象鎖時,再次請求該鎖是可以立即得到的。出現(xiàn)異常,會自動釋放鎖同步方法與同步代碼塊作用于整個方法,可能引起方法執(zhí)行效率下降。 synchronize可以在多個線程操作同一個成員變量或者方法時,實現(xiàn)同步(或者互斥)的效果。synchronized可以作用于方法,以及方法內(nèi)部的代碼塊。 ...
摘要:多線程進程正在進行中的程序。所以容易出現(xiàn)線程安全問題。等待喚醒機制涉及的方法將同步中的線程處于凍結(jié)狀態(tài)。返回該線程的字符串表示形式,包括線程名稱優(yōu)先級和線程組。暫停當前正在執(zhí)行的線程對象,并執(zhí)行其他線程。 多線程:進程:正在進行中的程序。其實進程就是一個應(yīng)用程序運行時的內(nèi)存分配空間。線程:其實就是進程中一個程序執(zhí)行控制單元,一條執(zhí)行路徑。進程負責的是應(yīng)用程序的空間的標示。線程負責的是應(yīng)...
摘要:當多個線程訪問實例時,每個線程維護提供的獨立的變量副本。而則從另一個角度來解決多線程的并發(fā)訪問。在執(zhí)行同步代碼塊的過程中,遇到異常而導(dǎo)致線程終止。在執(zhí)行同步代碼塊的過程中,其他線程執(zhí)行了當前對象的方法,當前線程被暫停,但不會釋放鎖。 一、Thread.start()與Thread.run()的區(qū)別通過調(diào)用Thread類的start()方法來啟動一個線程,這時此線程是處于就緒狀態(tài),并沒有...
閱讀 1712·2023-04-26 02:30
閱讀 1040·2021-11-10 11:36
閱讀 1387·2021-10-08 10:14
閱讀 3514·2021-09-28 09:35
閱讀 1557·2021-08-23 09:47
閱讀 2551·2019-08-30 15:56
閱讀 1475·2019-08-30 15:44
閱讀 1769·2019-08-30 13:59