日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何停止java线程

發布時間:2025/4/5 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何停止java线程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如何停止java的線程一直是一個困惱我們開發多線程程序的一個問題。這個問題最終在Java5的java.util.concurrent中得到了回答:使用interrupt(),讓線程在run方法中停止。

簡介

在Java的多線程編程中,java.lang.Thread類型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and resume()。通過這些方法,我們可以對線程進行方便的操作,但是這些方法中,只有start()方法得到了保留。

在Sun公司的一篇文章《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中詳細講解了舍棄這些方法的原因。那么,我們究竟應該如何停止線程呢?

建議使用的方法

在《Why are Thread.stop, Thread.suspend and Thread.resume Deprecated? 》中,建議使用如下的方法來停止線程:

??? private volatile Thread blinker;
??? public void stop() {
??????? blinker = null;
??? }
??? public void run() {
??????? Thread thisThread = Thread.currentThread();
??????? while (blinker == thisThread) {
??????????? try {
??????????????? thisThread.sleep(interval);
??????????? } catch (InterruptedException e){
??????????? }
??????????? repaint();
??????? }
??? }

關于使用volatile關鍵字的原因,請查看http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#36930。

當線程處于非運行(Run)狀態

當線程處于下面的狀況時,屬于非運行狀態:

  • 當sleep方法被調用。

  • 當wait方法被調用。

  • 當被I/O阻塞,可能是文件或者網絡等等。

當線程處于上述的狀態時,使用前面介紹的方法就不可用了。這個時候,我們可以使用interrupt()來打破阻塞的情況,如:

public void stop() {
Thread tmpBlinker = blinker;
blinker = null;
if (tmpBlinker != null) {
tmpBlinker.interrupt();
}
}

當interrupt()被調用的時候,InterruptedException將被拋出,所以你可以再run方法中捕獲這個異常,讓線程安全退出:

try {
....
wait();
} catch (InterruptedException iex) {
throw new RuntimeException("Interrupted",iex);
}

阻塞的I/O

當線程被I/O阻塞的時候,調用interrupt()的情況是依賴與實際運行的平臺的。在Solaris和Linux平臺上將會拋出InterruptedIOException的異常,但是Windows上面不會有這種異常。所以,我們處理這種問題不能依靠于平臺的實現。如:

package com.cnblogs.gpcuster

import java.net.*;
import java.io.*;

public abstract class InterruptibleReader extends Thread {

private Object lock = new Object( );
private InputStream is;
private boolean done;
private int buflen;
protected void processData(byte[] b, int n) { }

class ReaderClass extends Thread {

public void run( ) {
byte[] b = new byte[buflen];

while (!done) {
try {
int n = is.read(b, 0, buflen);
processData(b, n);
} catch (IOException ioe) {
done = true;
}
}

synchronized(lock) {
lock.notify( );
}
}
}

public InterruptibleReader(InputStream is) {
this(is, 512);
}

public InterruptibleReader(InputStream is, int len) {
this.is = is;
buflen = len;
}

public void run( ) {
ReaderClass rc = new ReaderClass( );

synchronized(lock) {
rc.start( );
while (!done) {
try {
lock.wait( );
} catch (InterruptedException ie) {
done = true;
rc.interrupt( );
try {
is.close( );
} catch (IOException ioe) {}
}
}
}
}
}

另外,我們也可以使用InterruptibleChannel接口。 實現了InterruptibleChannel接口的類可以在阻塞的時候拋出ClosedByInterruptException。如:

package com.cnblogs.gpcuster

import java.io.BufferedReader;
import java.io.FileDescriptor;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.channels.Channels;

public class InterruptInput {
static BufferedReader in = new BufferedReader(
new InputStreamReader(
Channels.newInputStream(
(new FileInputStream(FileDescriptor.in)).getChannel())));

public static void main(String args[]) {
try {
System.out.println("Enter lines of input (user ctrl+Z Enter to terminate):");
System.out.println("(Input thread will be interrupted in 10 sec.)");
// interrupt input in 10 sec(new TimeOut()).start();
String line = null;
while ((line = in.readLine()) != null) {
System.out.println("Read line:'"+line+"'");
}
} catch (Exception ex) {
System.out.println(ex.toString()); // printStackTrace();}}public static class TimeOut extends Thread {
int sleepTime = 10000;
Thread threadToInterrupt = null;
public TimeOut() {
// interrupt thread that creates this TimeOut.threadToInterrupt = Thread.currentThread();setDaemon(true);
}

public void run() {
try {
sleep(10000); // wait 10 sec} catch(InterruptedException ex) {/*ignore*/}
threadToInterrupt.interrupt();
}
}
}

這里還需要注意一點,當線程處于寫文件的狀態時,調用interrupt()不會中斷線程。

參考資料

How to Stop a Thread or a Task

Why are Thread.stop, Thread.suspend and Thread.resume Deprecated?

Java Threads, Third Edition O'Reilly

總結

以上是生活随笔為你收集整理的如何停止java线程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美亚洲 | 久久午夜夜伦鲁鲁一区二区 | 国产精品视频网址 | 影音先锋成人网 | 伊人久久99 | 欧美bbbbb性bbbbb视频 | 天干夜夜爽爽日日日日 | 免费观看国产精品视频 | 日本精品一区二区视频 | 九九免费在线视频 | 国产黄色免费网站 | 91黄色国产 | 99久久成人| 97精品国产 | 一级片黄色的 | 黑人巨大精品一区二区在线 | 日韩激情图片 | 大伊人久久 | 69久久夜色精品国产69 | www.chengren| 久久黄色一级视频 | 国产精久久久 | 理论片大全免费理伦片 | 林由奈在线观看 | 国产小视频免费观看 | 欧美丰满熟妇xxxx | www.亚洲人 | 国产又大又黄又爽 | 久久亚洲AV成人无码国产人妖 | 日韩久久久精品 | 91爱爱影院 | 少妇一级淫片免费视频 | 性饥渴的农村熟妇 | 成人一二三四区 | 精品人妻码一区二区三区红楼视频 | 五月婷综合 | 麻豆高清免费国产一区 | 黄色福利 | 国产粉嫩在线观看 | 亚洲久操 | 国产精品高潮呻吟久久aⅴ码 | 综合精品久久久 | av资源在线 | 成人午夜影视 | www.九色.com| 欧美1区2区3区 | 青青草国内自拍 | 欧美爱爱一区二区 | 4438x全国最大成人 | 激情久久久久 | 亚洲人 女学生 打屁股 得到 | 精品看片 | 成人国产综合 | 五月天在线播放 | 女的高潮流时喷水图片大全 | 欧美日本免费 | 无码一区二区三区视频 | 国产无码精品久久久 | 久久久三级视频 | 亚洲成人av一区 | 神马久久春色 | 爱爱网视频 | 国产精品传媒在线观看 | 欧美日韩免费高清一区色橹橹 | 亚洲欧美日韩综合一区二区 | 狠狠人妻久久久久久综合麻豆 | 一区二区欧美在线观看 | 麻豆视频91 | 国产精品99久久久久久动医院 | 欧美一级二级在线观看 | 日韩影院一区二区 | 假日游船 | av在线资源网站 | 国产精品二 | 97爱爱视频| 99久久精品国产亚洲 | 亚洲av永久无码国产精品久久 | 国产综合在线视频 | 亚洲av无码国产在丝袜线观看 | 午夜影院一区二区三区 | 亚洲国产精品欧美久久 | 91网在线播放 | 久国产视频 | 超碰三级 | 又黄又高潮的视频 | 久久国产激情 | 丁香花完整视频在线观看 | av毛片基地 | 黑人极品videos精品欧美裸 | 国产成人精品一区二区三区四区 | 久久久久亚洲AV成人 | 亚洲自拍偷拍精品视频 | 热久久在线 | 久久精品第一页 | 成人免费在线网址 | 裸体裸乳免费看 | 激情综合网激情 | 亚洲免费在线观看视频 | 91毛片观看|