Java线程关闭的3种方法_java

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();

}

}

时间: 2024-09-25 10:09:08

Java线程关闭的3种方法_java的相关文章

Java获取随机数的3种方法_java

主要介绍了Java获取随机数的3种方法,主要利用random()函数来实现 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1))例: (int)(1+Math.random()*(10-1+1)) 从1到10的int型随数 方法2 获得随机数 for (int i=0;i<30;i++) {System.out.println((int)(1+Math.random()*10));} (int)(1+Math.random()*10) 通过java.Math包的ra

详解Java解析XML的四种方法_java

XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object Model),DTD(Document Type Definition),SAX(Simple API for XML),XSD(Xml Schema Definition),XSLT(Extensible Stylesheet Language Transform

解析Java线程同步锁的选择方法_java

在需要线程同步的时候如何选择合适的线程锁?例:选择可以存入到常量池当中的对象,String对象等 复制代码 代码如下: public class SyncTest{    private String name = "name";public void method(String flag)    {        synchronized (name)        {            System.out.println(flag + ", invoke metho

Java线程池的几种实现方法和区别介绍_java

Java线程池的几种实现方法和区别介绍 import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.E

Java线程池的几种实现方法及常见问题解答_java

工作中,经常会涉及到线程.比如有些任务,经常会交与线程去异步执行.抑或服务端程序为每个请求单独建立一个线程处理任务.线程之外的,比如我们用的数据库连接.这些创建销毁或者打开关闭的操作,非常影响系统性能.所以,"池"的用处就凸显出来了. 1. 为什么要使用线程池 在3.6.1节介绍的实现方式中,对每个客户都分配一个新的工作线程.当工作线程与客户通信结束,这个线程就被销毁.这种实现方式有以下不足之处: •服务器创建和销毁工作的开销( 包括所花费的时间和系统资源 )很大.这一项不用解释,可以

Java线程中start和run方法全面解析_java

自定义线程两种方法 自定义一个runnable接口的实现类,然后构造一个thread,即对thread传入一个runnable接口类. new一个thread或者写个thread子类,覆盖它的run方法.(new 一个thread并覆盖run方法实际上是匿名内部类的一种方式) 示例代码 public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.

使用java获取md5值的两种方法_java

Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,是一种比较常用的哈希算法. java中可以用两种方法实现,我们先说麻烦一点的,代码: 复制代码 代码如下: public class md5_test { //MD5的字符串常量 private final static String[] hexDigits = { "0", "1", "2", "3"

java 字符串分割的三种方法(总结)_java

最近在项目中遇到一个小问题,一个字符串分割成一个数组,类似String str="aaa,bbb,ccc"; 然后以","为分割符,将其分割成一个数组,用什么方法去实现呢? 第一种方法: 可能一下子就会想到使用split()方法,用split()方法实现是最方便的,但是它的效率比较低 第二种方法: 使用效率较高的StringTokenizer类分割字符串,StringTokenizer类是JDK中提供的专门用来处理字符串分割子串的工具类.它的构造函数如下: publ

Java读取Map的两种方法与对比_java

前言 在java中遍历Map有不少的方法.这篇文章我们就来看一下Java读取Map的两种方法以及这两种方法的对比. 一. 遍历Map方法A Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (iter.hasNext()) { Map.Entry entry = (Map.Entry) iter.next(); Object key = entry.getKey(); Object val = en