c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法
一個(gè)多線程Java程序,只有當(dāng)其全部線程執(zhí)行結(jié)束時(shí)(更具體地說,是所有非守護(hù)線程結(jié)束或者某個(gè)線程調(diào)用system.exit()方法的時(shí)候) ,才會(huì)結(jié)束運(yùn)行。有時(shí),為了終止程序或者取消一個(gè)線程對(duì)象所執(zhí)行的任務(wù),我們需要終止一個(gè)線程。
Java使用一種中斷機(jī)制來向線程表明想要終止它。這個(gè)中斷機(jī)制依靠線程對(duì)象來檢查是否需要中斷,同時(shí)線程對(duì)象可以決定是否響應(yīng)中斷請(qǐng)求。當(dāng)然,一個(gè)線程對(duì)象也可以忽略中斷請(qǐng)求繼續(xù)執(zhí)行。
本節(jié)將開發(fā)一個(gè)應(yīng)用程序,它的作用是在線程創(chuàng)建5s后,使用中斷機(jī)制強(qiáng)制結(jié)束線程。
項(xiàng)目準(zhǔn)備
本案例是用Eclipse IDE來實(shí)現(xiàn)的。如果開發(fā)者使用Eclipse或者其他IDE (例如NetBeans ) ,則應(yīng)打開它并創(chuàng)建一個(gè)新的Java項(xiàng)目。
案例實(shí)現(xiàn)
根據(jù)以下步驟來完成本案例。
1,創(chuàng)建一個(gè)名為PrimeGenerator 的類,并繼承Thread類:
public class PrimeGenerator extends Thread{2.重寫run()方法——該方法包含一個(gè)無限while 循環(huán)。在循環(huán)中,處理從1開始的連續(xù)數(shù)字。如果是奇數(shù),那么將其輸出到控制臺(tái):
@Overridpublic void run() {long number=1L;while (true) {if (isPrime(number)) {System.out.printf("Number %d is Prime", number);}3,每處理完一個(gè)數(shù)字,通過isInterrupted()方法來判斷當(dāng)前線程是否已被中斷。如果該方法返回true ,那么表明當(dāng)前線程已被中斷。在這種情況下,在控制臺(tái)上打印一條信息并終止線程:
if (isInterrupted())System.out.printf ("The Prime Generator has been Interrupted");return;}number++;}}4,實(shí)現(xiàn)isPrime()方法。詳細(xì)代碼參見1.2節(jié)。
5,現(xiàn)在,開始實(shí)現(xiàn)應(yīng)用程序的主類,創(chuàng)建包含main()法的Main類:
public class Main{public static void main(string[] args) t6,創(chuàng)建PrimeGenerator類的對(duì)象,并啟動(dòng)它:
Thread task=new PrimeGenerator();task.start()7·在主線程中等待5s后,中斷PrimeGenerator線程:
try{Thread.sleep(5000);}catch (InterruptedException e) {e.printstackTrace();}task.interrupt();8,輸出中斷線程的狀態(tài)。這段代碼的輸出結(jié)果取決于它是在線程結(jié)束前還是線程結(jié)束后運(yùn)行的:
System.out, printf("Main: status of the Thread: %s",task,getstate());System.out, printf("Main: isInterrupted: %s",task.isInterrupted());System.out, printf("Main: isAlive: %s", task,isAlive());}9,運(yùn)行案例并查看結(jié)果。
結(jié)果分析
下面是以上案例運(yùn)行結(jié)果的截圖。從圖中可以看到, PrimeGenerator線程在檢測(cè)到自己被中斷后,輸出信息并結(jié)束了運(yùn)行。
Thread類有一個(gè)用來保存線程是否已被中斷的狀態(tài)屬性,其屬性值為 boolean類型,默認(rèn)值為false 。當(dāng)調(diào)用一個(gè)線程對(duì)象的interrupt()方法時(shí),該狀態(tài)屬性將修改為true 。而方法isInterrupted() 僅返回該狀態(tài)屬性的值。
在main()方法中,輸出了中斷線程的一些狀態(tài)信息。在本案例中,雖然在這些代碼之前調(diào)用了線程的中斷,但是在執(zhí)行這些代碼時(shí),任務(wù)線程并未執(zhí)行到中斷判斷和處理過程,因此,此時(shí)輸出的線程狀態(tài)為RUMMABL E ,方法 isInterrupted()的結(jié)果為 true ,當(dāng)然方法isAlive() 的結(jié)果也為true 。如果這些代碼執(zhí)行是在Thread中斷完成之后[可以制造機(jī)會(huì),如通過在main調(diào)用sleep() 使得主線程休眼1s,使得task 線程完成中斷,那么 isInterrupted )和 isAlive() 的結(jié)果將為false 。.
其他說明
在Thread類中,還有一個(gè)靜態(tài)辦法interrupted(),也能用來檢測(cè)當(dāng)前線程是否已被中斷。
正如前文所說,線程對(duì)象可以忽略中斷,但這并不是被預(yù)期的行為。
本文節(jié)選自《Java 9 并發(fā)編程實(shí)戰(zhàn)》
本書將帶你了解所有的新API,向您展示如何構(gòu)建并行多線程應(yīng)用程序。這本書涵蓋了所有Java并發(fā)API的元素,包括基本配方,這些幫助您利用激動(dòng)人心的新功能。您將學(xué)習(xí)如何使用并行和反應(yīng)流來處理大規(guī)模數(shù)據(jù)集。接下來,您將繼續(xù)創(chuàng)建流,并使用他們所有中間和終端的操作以一種并行且函數(shù)性的方式來進(jìn)行數(shù)據(jù)的收集。此外,你會(huì)了解一系列的實(shí)戰(zhàn)方式,如線程管理、同步、執(zhí)行人、并行和反應(yīng)流等。
總結(jié)
以上是生活随笔為你收集整理的c++并发编程实战_Java 并发编程实战:JAVA中断线程几种基本方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怪物猎人世界pc修改珠子怎么做
- 下一篇: 小米9有几个喇叭(小米官方售后服务)