Java线程关闭的3种方法

 更新时间:2013年10月16日 15:27:41   作者:  
这篇文章介绍了Java线程关闭的3种方法,有需要的朋友可以参考一下

Java线程关闭,总的来说有3种:

1.使用状态位,这个简单,就不多说了:

复制代码 代码如下:

public class Task extends Thread {

private volatile boolean flag= true;

public void stopTask() {

flag = false;

}

@Override

public void run() {

while(flag){

/* do your no-block task */

}

}

}


2.当线程等待某些事件发生而被阻塞,又会发生什么?当然,如果线程被阻塞,它便不能核查共享变量,也就不能停止。这在许多情况下会发生,例如调用 Object.wait()、Thread.sleep等,这里仅举出一些。他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。这个时候你可以使用
复制代码 代码如下:

Thread.interrupt();

public class BlockTask extends Thread {

@Override

public void run() {

try {

while (!Thread.interrupted()) {

/* do your block task*/

}

} catch (Exception e) {

e.printStackTrace();

}

}

}


但是上面的代码或许有些不妥,或许用例子更能把问题说清楚。你怎么知道该代码段会发生阻塞?interrupt()函数到底是什么意思呢?首先说明的是,interrupted()方法只能解决跑出InterruptedException异常的阻塞。而interrupt()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:
复制代码 代码如下:

public class BlockTask extends Thread {

@Override

public void run() {

try {

sleep(10000);

} catch (InterruptedException e) {

System.out.println("if yout use interrupt you will see me");

}


}

public static void main(String[] args)throws Exception {

// TODO Auto-generated method stub

BlockTask task = new BlockTask();

task.start();

Thread.sleep(1000);

task.interrupt();


}

}


3.上面说了,interrupt()只能解决InterruptedException的阻塞的线程,那么遇到一些其他的io阻塞怎么处理呢?这个时候java都会提供相应的关闭阻塞的办法。例如,服务器可能需要等待一个请求(request),又或者,一个网络应用程序可能要等待远端主机的响应,这个时候可以使用套接字close()方法
复制代码 代码如下:

public class SocketTask extends Thread {

private volatile ServerSocket server;


public void stopTask(){

try {

if(server!=null){

server.close();

System.out.println("close task successed");

}

} catch (IOException e) {

System.out.println("close task failded");

}

}

@Override

public void run() {

try {

server = new ServerSocket(3333);

} catch (IOException e) {

e.printStackTrace();

}

}

public static void main(String[] args) throws InterruptedException {


SocketTask task = new SocketTask();

task.start();

Thread.sleep(1000);

task.stopTask();

}

}

相关文章

  • 关于maven配置项目一直提示程序包不存在以及scope的坑

    关于maven配置项目一直提示程序包不存在以及scope的坑

    这篇文章主要介绍了关于maven配置项目一直提示程序包不存在以及scope的坑,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解Java如何实现FP-Growth算法

    详解Java如何实现FP-Growth算法

    学校里的实验,要求实现FP-Growth算法.FP-Growth算法比Apriori算法快很多(但是却比不上时间)在网上搜索后发现Java实现的FP-Growth算法很少,且大多数不太能理解):太菜.所以就自己实现了一下.这篇文章重点介绍一下我的Java实现 ,需要的朋友可以参考下
    2021-06-06
  • 一文带你初识java中的String类

    一文带你初识java中的String类

    String代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现,这篇文章主要给大家介绍了关于java中String类的相关资料,需要的朋友可以参考下
    2021-10-10
  • windows下使用 intellij idea 编译 kafka 源码环境

    windows下使用 intellij idea 编译 kafka 源码环境

    这篇文章主要介绍了使用 intellij idea 编译 kafka 源码的环境,本文是基于windows下做的项目演示,需要的朋友可以参考下
    2021-10-10
  • Java8如何通过Lambda处理List集合

    Java8如何通过Lambda处理List集合

    这篇文章主要介绍了java8如何通过Lambda处理List集合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Java参数传递实现代码及过程图解

    Java参数传递实现代码及过程图解

    这篇文章主要介绍了Java参数传递实现代码及过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 一文带你深入了解Java8 Stream流式编程

    一文带你深入了解Java8 Stream流式编程

    在实际项目当中,若能熟练使用Java8 的Stream流特性进行开发,就比较容易写出简洁优雅的代码。本文主要就是基于实际项目常用的Stream Api流式处理总结,希望对大家有所帮助
    2023-04-04
  • Java递归调用如何实现数字的逆序输出方式

    Java递归调用如何实现数字的逆序输出方式

    这篇文章主要介绍了Java递归调用如何实现数字的逆序输出方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • 解决java.util.HashMap$Values cannot be cast to java.ut的问题

    解决java.util.HashMap$Values cannot be cast to java.ut的问题

    这篇文章主要介绍了解决java.util.HashMap$Values cannot be cast to java.ut的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • RestTemplate在Spring或非Spring环境下使用精讲

    RestTemplate在Spring或非Spring环境下使用精讲

    这篇文章主要为大家介绍了RestTemplate在Spring或非Spring环境下使用精讲,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03

最新评论