摘要:方法返回當(dāng)前線程的構(gòu)造方法執(zhí)行結(jié)果構(gòu)造方法在初始化的過程中都是在主線程執(zhí)行,后開啟新線程執(zhí)行。方法是事當(dāng)前線程睡眠暫停毫秒。在睡眠過程中,線程會(huì)讓出,但不會(huì)失去已鎖定的資源。
上文介紹了Tread的實(shí)例方法,本文再介紹下Thread的靜態(tài)方法。
currentThread()currentThread方法返回當(dāng)前線程的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方法是事當(dāng)前線程睡眠(暫停)n毫秒。在睡眠過程中,線程會(huì)讓出cpu,但不會(huì)失去已鎖定的資源。
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)時(shí)間分配等因素,執(zhí)行結(jié)果都會(huì)大于等于指定的毫秒數(shù),但不會(huì)差太多。另外sleep方法會(huì)拋出InterruptedException 的異常,在上文中也有講到。
yield()yield方法是讓出cpu的使用,讓出多少時(shí)間是不確定的。
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 .....
當(dāng)然每次執(zhí)行的結(jié)果可能都不一樣,這里可以看在執(zhí)行到i==30時(shí),"張三"讓出了cpu使用,"李四"則開始執(zhí)行。
interrupted()返回當(dāng)前線程是否被中斷,實(shí)現(xiàn)就是
return currentThread().isInterrupted(true);holdsLock(Object obj)
holdsLock是判斷某個(gè)資源是否被線程鎖定,
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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70667.html
摘要:程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行,這個(gè)運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個(gè)線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會(huì)拋出異常。 線程 我們?cè)陂喿x程序時(shí),表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個(gè)時(shí)間點(diǎn)執(zhí)行的處理只有一個(gè)。 Java 程序執(zhí)行時(shí),至少會(huì)有一個(gè)線程在運(yùn)行...
摘要:同步代碼塊二類,鎖是小括號(hào)中的類對(duì)象對(duì)象。因?yàn)閷?duì)于同一個(gè)實(shí)例對(duì)象,各線程之間訪問其中的同步方法是互斥的。優(yōu)化同步代碼塊的方式有,減少同步區(qū)域或減小鎖的范圍。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請(qǐng)注明出處:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多線程編程中,我們常需要考慮線程安全問題,其中關(guān)鍵字 synchro...
摘要:非靜態(tài)方法以及方法內(nèi)部的代碼塊持有的是同一個(gè)對(duì)象鎖,它們是同步執(zhí)行的??芍厝腈i使用時(shí),當(dāng)一個(gè)線程請(qǐng)求一個(gè)對(duì)象鎖時(shí),再次請(qǐng)求該鎖是可以立即得到的。出現(xiàn)異常,會(huì)自動(dòng)釋放鎖同步方法與同步代碼塊作用于整個(gè)方法,可能引起方法執(zhí)行效率下降。 synchronize可以在多個(gè)線程操作同一個(gè)成員變量或者方法時(shí),實(shí)現(xiàn)同步(或者互斥)的效果。synchronized可以作用于方法,以及方法內(nèi)部的代碼塊。 ...
摘要:多線程進(jìn)程正在進(jìn)行中的程序。所以容易出現(xiàn)線程安全問題。等待喚醒機(jī)制涉及的方法將同步中的線程處于凍結(jié)狀態(tài)。返回該線程的字符串表示形式,包括線程名稱優(yōu)先級(jí)和線程組。暫停當(dāng)前正在執(zhí)行的線程對(duì)象,并執(zhí)行其他線程。 多線程:進(jìn)程:正在進(jìn)行中的程序。其實(shí)進(jìn)程就是一個(gè)應(yīng)用程序運(yùn)行時(shí)的內(nèi)存分配空間。線程:其實(shí)就是進(jìn)程中一個(gè)程序執(zhí)行控制單元,一條執(zhí)行路徑。進(jìn)程負(fù)責(zé)的是應(yīng)用程序的空間的標(biāo)示。線程負(fù)責(zé)的是應(yīng)...
摘要:當(dāng)多個(gè)線程訪問實(shí)例時(shí),每個(gè)線程維護(hù)提供的獨(dú)立的變量副本。而則從另一個(gè)角度來解決多線程的并發(fā)訪問。在執(zhí)行同步代碼塊的過程中,遇到異常而導(dǎo)致線程終止。在執(zhí)行同步代碼塊的過程中,其他線程執(zhí)行了當(dāng)前對(duì)象的方法,當(dāng)前線程被暫停,但不會(huì)釋放鎖。 一、Thread.start()與Thread.run()的區(qū)別通過調(diào)用Thread類的start()方法來啟動(dòng)一個(gè)線程,這時(shí)此線程是處于就緒狀態(tài),并沒有...
閱讀 1724·2023-04-26 02:30
閱讀 1057·2021-11-10 11:36
閱讀 1397·2021-10-08 10:14
閱讀 3525·2021-09-28 09:35
閱讀 1565·2021-08-23 09:47
閱讀 2561·2019-08-30 15:56
閱讀 1487·2019-08-30 15:44
閱讀 1778·2019-08-30 13:59