摘要:之前有簡單介紹過多線程的使用,已經(jīng)類和類,為了更好地理解多線程,本文就進(jìn)行詳細(xì)的分析。方法是強(qiáng)制停止線程的執(zhí)行,是非安全的,不要使用此方法。比較簡單,獲取線程的名稱。和方法的作用是等待線程執(zhí)行完成,可以設(shè)置最長等待時間。
之前有簡單介紹過java多線程的使用,已經(jīng)Thread類和Runnable類,為了更好地理解多線程,本文就Thread進(jìn)行詳細(xì)的分析。
start()start方法是開啟線程的方法,使用后java會創(chuàng)建一個新的線程執(zhí)行run里的方法。這是一個小demo:
for(int i=0;i<3;i++){ Thread t= new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+" start"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" end"); } }); t.start(); } System.out.println("it is over");
執(zhí)行結(jié)果:
it is over
Thread-1 start
Thread-0 start
Thread-2 start
Thread-0 end
Thread-1 end
Thread-2 end
由于多線程是有隨機(jī)性的,所以每次的結(jié)果可能都不一樣,這一點(diǎn)也是我們需要注意的,線程的執(zhí)行順序和調(diào)用順序并不一致。
run()run方法就是調(diào)用Thread設(shè)置的Runnable的run方法,將上面的demo進(jìn)行修改:
for(int i=0;i<3;i++){ Thread t= new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+" start"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" end"); } }); t.run(); } System.out.println("it is over");
執(zhí)行結(jié)果:
main start
main end
main start
main end
main start
main end
it is over
run方法的直接結(jié)果和start有很大的差別,完全是按順序執(zhí)行,并沒有開啟新線程。
stop方法是強(qiáng)制停止線程的執(zhí)行,是非安全的,不要使用此方法。在調(diào)用stop時, 會對鎖定的資源進(jìn)行釋放,但這種釋放是非一致的,容易引起程序問題。如果想要控制線程的停止,可以使用自定義變量來判斷或者isInterrupted()方法:
class Thread1 extends Thread { @Override public void run() { //判斷線程體是否運(yùn)行 while (!isInterrupted()) { // Do Something } } }interrupt()
interrupt的作用是通知線程,你已經(jīng)被中斷的,但具體的中斷執(zhí)行需要在線程自定義處理,甚至你可以不理會繼續(xù)執(zhí)行。具體的中孤單是會線程執(zhí)行join、wait、sleep方法時,拋出InterruptedException。
Thread t1 = new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+" start"); try { for(int i=0;i<100000;i++){ System.out.println(i+""); Thread.sleep(1); } } catch (InterruptedException e) { System.out.println("the thread is interrupted");//可以在這里做資源釋放,日志記錄等 e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" end"); } }); t1.start(); Thread.sleep(100); t1.interrupt();
執(zhí)行結(jié)果:
65 66 67 68 the thread is interrupted java.lang.InterruptedException: sleep interrupted Thread-0 end at java.lang.Thread.sleep(Native Method) at com.wk.aqi.act.Test$1.run(Test.java:23) at java.lang.Thread.run(Thread.java:745)isInterrupted()
判斷線程是否中斷,在執(zhí)行上面的interrupt方法后,會return true。
setPriority(int newPriority)和getPriority()設(shè)置線程的優(yōu)先級和獲取線程的優(yōu)先級,cpu分配的資源給側(cè)重給priority高的線程。
Thread t1 = new Thread(new Runnable() { @Override public void run() { long t = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+" start"); for(int i=0;i<1000;i++){ try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t)); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { long t = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+" start"); for(int i=0;i<1000;i++){ try { Thread.sleep(1); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println(Thread.currentThread().getName()+" t2 end "+(System.currentTimeMillis()-t)); } }); t1.setPriority(10); t2.setPriority(1); t2.start(); t1.start();
執(zhí)行結(jié)果:
Thread-0 start Thread-1 start Thread-0 t1 end 1357 Thread-1 t2 end 1371
在優(yōu)先級一樣的情況下,t1和t2是幾乎同時完成的,在優(yōu)先級不一樣的情況,有明顯的差別。
getName()比較簡單,獲取線程的名稱。
join()和join(long millis)jion方法的作用是等待線程執(zhí)行完成,join(long millis)可以設(shè)置最長等待時間。比如主線程需要等待子線程完成,獲取子線程的結(jié)果后才能繼續(xù)往下執(zhí)行,這時候就可以使用join方法
Thread t1 = new Thread(new Runnable() { @Override public void run() { long t = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+" start"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+" t1 end "+(System.currentTimeMillis()-t)); } }); t1.start(); t1.join(); System.out.println("等待t1執(zhí)行完,再執(zhí)行");
執(zhí)行結(jié)果:
Thread-0 start Thread-0 t1 end 1001 等待t1執(zhí)行完,再執(zhí)行
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/70679.html
摘要:程序執(zhí)行時,至少會有一個線程在運(yùn)行,這個運(yùn)行的線程被稱為主線程。程序的終止是指除守護(hù)線程以外的線程全部終止。多線程程序由多個線程組成的程序稱為多線程程序。線程休眠期間可以被中斷,中斷將會拋出異常。 線程 我們在閱讀程序時,表面看來是在跟蹤程序的處理流程,實(shí)際上跟蹤的是線程的執(zhí)行。 單線程程序 在單線程程序中,在某個時間點(diǎn)執(zhí)行的處理只有一個。 Java 程序執(zhí)行時,至少會有一個線程在運(yùn)行...
摘要:一線程的基本概念單線程簡單的說,單線程就是進(jìn)程中只有一個線程。多線程由一個以上線程組成的程序稱為多線程程序。當(dāng)線程調(diào)用完方法進(jìn)入后會自動釋放鎖,線程獲得鎖。 一、線程的基本概念 1.1 單線程 簡單的說,單線程就是進(jìn)程中只有一個線程。單線程在程序執(zhí)行時,所走的程序路徑按照連續(xù)順序排下來,前面的必須處理好,后面的才會執(zhí)行。 Java示例: public class SingleThrea...
摘要:返回與此鎖相關(guān)聯(lián)的給定條件等待的線程數(shù)的估計。查詢是否有線程正在等待獲取此鎖。為公平鎖,為非公平鎖線程運(yùn)行了獲得鎖定運(yùn)行結(jié)果公平鎖的運(yùn)行結(jié)果是有序的。 系列文章傳送門: Java多線程學(xué)習(xí)(一)Java多線程入門 Java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(1) java多線程學(xué)習(xí)(二)synchronized關(guān)鍵字(2) Java多線程學(xué)習(xí)(三)volatile關(guān)鍵字 ...
摘要:這種方式實(shí)現(xiàn)多線程很簡單,通過自己的類直接,并復(fù)寫方法,就可以啟動新線程并執(zhí)行自己定義的方法。 JAVA多線程實(shí)現(xiàn)方式主要有兩種:繼承Thread類、實(shí)現(xiàn)Runnable接口。 1、繼承Thread類實(shí)現(xiàn)多線程 繼承Thread類的方法盡管被我列為一種多線程實(shí)現(xiàn)方式,但Thread本質(zhì)上也是實(shí)現(xiàn)了Runnable接口的一個實(shí)例,它代表一個線程的實(shí)例,并且,啟動線程的唯一方法就是通過...
摘要:上下文切換會影響到線程的執(zhí)行速度,對于系統(tǒng)來說意味著會消耗大量的時間減少上下文切換的方式無鎖并發(fā)編程,在多線程競爭鎖時,會導(dǎo)致大量的上下文切換。線程在中的使用在中實(shí)現(xiàn)多線程的方式比較簡單,因?yàn)橹刑峁┝朔浅7奖愕膩韺?shí)現(xiàn)多線程。 文章簡介 上一篇文章我們了解了進(jìn)程和線程的發(fā)展歷史、線程的生命周期、線程的優(yōu)勢和使用場景,這一篇,我們從Java層面更進(jìn)一步了解線程的使用 內(nèi)容導(dǎo)航 并發(fā)編程的...
摘要:同步代碼塊二類,鎖是小括號中的類對象對象。因?yàn)閷τ谕粋€實(shí)例對象,各線程之間訪問其中的同步方法是互斥的。優(yōu)化同步代碼塊的方式有,減少同步區(qū)域或減小鎖的范圍。 版權(quán)聲明:本文由吳仙杰創(chuàng)作整理,轉(zhuǎn)載請注明出處:https://segmentfault.com/a/1190000009225706 1. 引言 在 Java 多線程編程中,我們常需要考慮線程安全問題,其中關(guān)鍵字 synchro...
閱讀 2282·2021-09-27 13:35
閱讀 569·2019-08-30 15:55
閱讀 820·2019-08-30 15:53
閱讀 567·2019-08-30 15:52
閱讀 2155·2019-08-30 12:59
閱讀 2280·2019-08-29 16:42
閱讀 1442·2019-08-26 18:26
閱讀 2478·2019-08-26 13:48