當前位置:首頁 » 編程語言 » 線程終止java

線程終止java

發布時間: 2023-05-22 20:27:24

『壹』 java線程如何停止

終止線程的三種方法:
1. 使用退出標志,使線程正常退出,也就是當run方法完成後線程終止。
2. 使用stop方法強行終止線程(這個方法不推薦使用,因為stop和suspend、resume一樣,也可能發生不可預料的結果)。
3. 使用interrupt方法中斷線程。

1. 使用退出標志終止線程
當run方法執行完後,線程就會退出。但有時run方法是永遠不會結束的。如在服務端程序中使用線程進行監聽客戶端請求,或是其他的需要循環處理的任務。在這種情況下,一般是將這些任務放在一個循環中,如while循環。如果想讓循環永遠運行下去,可以使用while(true){……}來處理。但要想使while循環在某一特定條件下退出,最直接的方法就是設一個boolean類型的標志,並通過設置這個標志為true或false來控制while循環是否退出。下面給出了一個利用退出標志終止線程的例子。

packagechapter2;

{
publicvolatilebooleanexit=false;
publicvoidrun()
{
while(!exit);
}
publicstaticvoidmain(String[]args)throwsException
{
ThreadFlagthread=newThreadFlag();
thread.start();
sleep(5000);//主線程延遲5秒
thread.exit=true;//終止線程thread
thread.join();
System.out.println("線程退出!");
}
}

在上面代碼中定義了一個退出標志exit,當exit為true時,while循環退出,exit的默認值為false.在定義exit時,使用了一個Java關鍵字volatile,這個關鍵字的目的是使exit同步,也就是說在同一時刻只能由一個線程來修改exit的值,

2. 使用stop方法終止線程
使用stop方法可以強行終止正在運行或掛起的線程。我們可以使用如下的代碼來終止線程:
thread.stop();
雖然使用上面的代碼可以終止線程,但使用stop方法是很危險的,就象突然關閉計算機電源,而不是按正常程序關機一樣,可能會產生不可預料的結果,因此,並不推薦使用stop方法來終止線程。

3. 使用interrupt方法終止線程
使用interrupt方法來終端線程可分為兩種情況:
(1)線程處於阻塞狀態,如使用了sleep方法。
(2)使用while(!isInterrupted()){……}來判斷線程是否被中斷。
在第一種情況下使用interrupt方法,sleep方法將拋出一個InterruptedException例外,而在第二種情況下線程將直接退出。下面的代碼演示了在第一種情況下使用interrupt方法。

packagechapter2;

{
publicvoidrun()
{
try
{
sleep(50000);//延遲50秒
}
catch(InterruptedExceptione)
{
System.out.println(e.getMessage());
}
}
publicstaticvoidmain(String[]args)throwsException
{
Threadthread=newThreadInterrupt();
thread.start();
System.out.println("在50秒之內按任意鍵中斷線程!");
System.in.read();
thread.interrupt();
thread.join();
System.out.println("線程已經退出!");
}
}

上面代碼的運行結果如下:
在50秒之內按任意鍵中斷線程!
sleep interrupted
線程已經退出!
在調用interrupt方法後, sleep方法拋出異常,然後輸出錯誤信息:sleep interrupted.
注意:在Thread類中有兩個方法可以判斷線程是否通過interrupt方法被終止。一個是靜態的方法interrupted(),一個是非靜態的方法isInterrupted(),這兩個方法的區別是interrupted用來判斷當前線是否被中斷,而isInterrupted可以用來判斷其他線程是否被中斷。因此,while (!isInterrupted())也可以換成while (!Thread.interrupted())。

『貳』 java線程如何停止

通過調用interrupt方法可以使得處於阻塞狀態的線程拋出一個異常,即interrupt方法可以用來中斷一個正處於阻塞狀態的線程;另外,改方法還會設置線程的中斷狀態(註:isInterrupted()可以用來查詢中斷狀態)。

『叄』 java如何關閉線程

關閉線程有幾種方法,
一種是調用它裡面的stop()方法
另一種就是你自己設置一個停止線程的標記 (推薦這種)
代碼如下:
package com.demo;
//測試Thread的stop方法和自己編寫一個停止標記來停止線程;
public class StopThread implements Runnable{
//停止線程的標記值boolean;
private boolean flag = true;
public void stopThread(){
flag = false;
}
public void run(){
int i=0;
while(flag){
i++;
System.out.println(Thread.currentThread().getName()+":"+i);
try{
Thread.sleep(1000);
}catch(Exception e){
}
System.out.println(Thread.currentThread().getName()+"==>"+i);
}
}
public static void main(String args[]){
StopThread st = new StopThread();
Thread th = new Thread(st);
Thread th1 = new Thread(st);
th.start();
th1.start();
try{
Thread.sleep(5500);
}catch(Exception e){
}
/*
如果使用Thread.stop方法停止線程,不能保證這個線程是否完整的運行完成一次
run方法;但是如果使用停止的標記位,那麼可以保正在真正停止之前完整的運行完
成一次run方法;
*/
th.stop();
st.stopThread();
}
}

『肆』 Java中如何正確而優雅的終止運行中的線程

Java中終止線程的方式主要有三種:

1、使用stop()方法,已被棄用。原因是:stop()是立即終止,會導致一些數據被到處理一部分就會被終止,而用戶並不知道哪些數據被處理,哪些沒有被處理,產生了不完整的「殘疾」數據,不符合完整性,所以被廢棄。So, forget it!

2、使用volatile標志位

看一個簡單的例子:

首先,實現一個Runnable介面,在其中定義volatile標志位,在run()方法中使用標志位控製程序運行

{

//定義退出標志,true會一直執行,false會退出循環
//使用volatile目的是保證可見性,一處修改了標志,處處都要去主存讀取新的值,而不是使用緩存
publicvolatilebooleanflag=true;

publicvoidrun(){
System.out.println("第"+Thread.currentThread().getName()+"個線程創建");

try{
Thread.sleep(1000L);
}catch(InterruptedExceptione){
e.printStackTrace();
}

//退出標志生效位置
while(flag){
}
System.out.println("第"+Thread.currentThread().getName()+"個線程終止");
}
}

然後,在main()方法中創建線程,在合適的時候,修改標志位,終止運行中的線程。

publicclassTreadTest{
publicstaticvoidmain(String[]arg)throwsInterruptedException{
MyRunnablerunnable=newMyRunnable();

//創建3個線程
for(inti=1;i<=3;i++){
Threadthread=newThread(runnable,i+"");
thread.start();
}
//線程休眠
Thread.sleep(2000L);
System.out.println("——————————————————————————");
//修改退出標志,使線程終止
runnable.flag=false;
}
}

最後,運行結果,如下:

第1個線程創建
第2個線程創建
第3個線程創建
--------------------------
第2個線程終止
第1個線程終止
第3個線程終止

3、使用interrupt()中斷的方式,注意使用interrupt()方法中斷正在運行中的線程只會修改中斷狀態位,可以通過isInterrupted()判斷。如果使用interrupt()方法中斷阻塞中的線程,那麼就會拋出InterruptedException異常,可以通過catch捕獲異常,然後進行處理後終止線程。有些情況,我們不能判斷線程的狀態,所以使用interrupt()方法時一定要慎重考慮。

『伍』 如何停止一個正在運行的java線程

在Java中有專門終止某個線程的API,如stop()和段棚絕interrupt()。其中stop()由於安全機制的我問題已經被廢棄不用,現在就剩下interrupt。其實這個方和扒法並不是一個終斷動作的操作,而是一個設置終斷狀態的操作。它需要和isInterrupted()配合使用。例如:
package org.leadfar;

public class MyThread04 extends Thread {

private boolean stop = false;
public MyThread04(String threadName) {
super(threadName);
}

@Override
public void run() {

for (int j = 0; j < 100; j++) {
if(this.isInterrupted()) break;
System.out.println(Thread.currentThread().getName()+":"+j);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public void setStop() {
this.stop = true;
}

//第一個線程
public static void main(String[] args) {
MyThread04 t = new MyThread04("輔線程");
t.start();

for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
System.out.println("....................");
t.interrupt();

}
}
但這個很可能不會終止線程,因為當我們終止這個線程時很可能就會發生InterruptedException異常,當有這個異常發生時我們設置的終斷狀態也會被清除,所以我們要終斷某個線程應採用以下這個方法握姿:
public class MyThread04 extends Thread {

private boolean stop = false;
public MyThread04(String threadName) {
super(threadName);
}

@Override
public void run() {

for (int j = 0; j < 100; j++) {
if(stop) break;
System.out.println(Thread.currentThread().getName()+":"+j);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}

public void setStop() {
this.stop = true;
}

//第一個線程
public static void main(String[] args) {
MyThread04 t = new MyThread04("輔線程");
t.start();

for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+":"+i);
}
System.out.println("....................");
t.setStop();
}
}

『陸』 如何在JAVA中讓一個線程死亡或結束

當線程執行完畢或被其它線程殺死,線程就進入死亡狀態,這時線程不可能再進入就緒狀態等待執行。
線程進入死亡狀態的方法有兩種:
1、自然終止:正常運行run()方法後終止;
2、異常終止:調用stop()方法讓一個線程終止運行。
如下代碼:
public class ThreadDemo implements Runnable{
public void run() {
}
}
當run方法執行結束,即線程死亡(結束)。

熱點內容
手機如何解壓百度雲文件 發布:2024-05-19 00:32:24 瀏覽:904
centos使用python 發布:2024-05-18 23:39:48 瀏覽:867
幻影天龍腳本 發布:2024-05-18 23:38:17 瀏覽:712
編程的py 發布:2024-05-18 23:36:22 瀏覽:74
安卓系統怎麼改序列號 發布:2024-05-18 23:28:16 瀏覽:783
c語言中實數 發布:2024-05-18 23:21:03 瀏覽:895
伺服器搭建題目 發布:2024-05-18 23:01:29 瀏覽:28
下載武裝突襲後怎麼進伺服器 發布:2024-05-18 22:56:17 瀏覽:825
c語言字元串大寫變小寫 發布:2024-05-18 22:56:16 瀏覽:438
重啟刪除的文件夾 發布:2024-05-18 22:34:11 瀏覽:638