技术中心

这里象征着我们的态度和能力

>Java线程关闭:代码实战总结
发布者:中国IT实验室    信息来源:中国IT实验室    发布时间:2012-01-09      浏览次数:4680
分享到:

新浪微博

腾讯微博

QQ空间

豆瓣网

QQ好友

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

    总的来说有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()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:

    1 public class BlockTask extends Thread {

    2 @Override

    3 public void run() {

    4 try {

    5 sleep(10000);

    6 } catch (InterruptedException e) {

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

    8 }

    9

    10 }

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

    12 // TODO Auto-generated method stub

    13 BlockTask task = new BlockTask();

    14 task.start();

    15 Thread.sleep(1000);

    16 task.interrupt();

    17

    18 }

    19 }

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

    1 public class SocketTask extends Thread {

    2 private volatile ServerSocket server;

    3

    4 public void stopTask(){

    5 try {

    6 if(server!=null){

    7 server.close();

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

    9 }

    10 } catch (IOException e) {

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

    12 }

    13 }

    14 @Override

    15 public void run() {

    16 try {

    17 server = new ServerSocket(3333);

    18 } catch (IOException e) {

    19 e.printStackTrace();

    20 }

    21 }

    22

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

    24

    25 SocketTask task = new SocketTask();

    26 task.start();

    27 Thread.sleep(1000);

    28 task.stopTask();

    29 }

    30

    31 }

4000-880-989
(24小时热线)
联系客服
微信公众号

官方公众号

小程序

©2008-2022 CORPORATION ALL Rights Reserved. 版权所有 滇ICP备09003328号-1 滇公网安备 53011102000818号
昆明那家网络公司好,新媒体运营,网站优化,网络推广,网站建设,网页设计,网站设计,网站推广,云南网站公司,昆明新媒体公司,云南网红主播,昆明SEO公司,昆明网站建设,昆明网络推广,昆明网站优化,昆明网站推广,红河网站建设,大理网络公司,曲靖网络公司,丽江网站设计,昭通网络公司,保山大数据服务,智慧高速建设,智慧校园服务,云南IDC服务商,网络安全测评,等保测评,网站关键词排名优化服务,服务客户尽超2000余家,一切尽在奥远科技,服务电话:13888956730
Baidu
map