源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java线程关闭的3种方法

  • 时间:2020-10-25 04:35 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java线程关闭的3种方法
Java线程关闭,总的来说有3种: 1.使用状态位,这个简单,就不多说了:
[u]复制代码[/u] 代码如下:
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等,这里仅举出一些。他们都可能永久的阻塞线程。即使发生超时,在超时期满之前持续等待也是不可行和不适当的,所以,要使用某种机制使得线程更早地退出被阻塞的状态。这个时候你可以使用
[u]复制代码[/u] 代码如下:
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()并不是关闭阻塞线程,而是解除阻塞。那这里就举出一个关闭线程阻塞的例子:
[u]复制代码[/u] 代码如下:
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()方法
[u]复制代码[/u] 代码如下:
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(); } }
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部