zoukankan      html  css  js  c++  java
  • 3种方法关闭Java线程

          广州疯狂java专注于java培训,通过科学标准的java培训,让零基础学员快速成长为高端java开发工程师,迅速成为企业最急需技术型人才,成功进入IT名企。

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

      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 }

      疯狂Java培训紧跟最前沿的技术潮流,采用的都是企业最真实的项目开发,培养学生的实践动手能力。技术在不断更新换代,在疯狂软件学院你能学到最前沿的Java技术,疯狂Java培训主要培养的是Java专业人才。学员毕业之后的代码量至少达到项目经理的水平。疯狂软件学院有完善的就业服务机制,学员毕业时,可以享受免费终身推荐就业服务。根据学员的特点和企业的要求,为学员推荐最合适的岗位。

  • 相关阅读:
    Could A New Linux Base For Tablets/Smartphones Succeed In 2017?
    使用libhybris,glibc和bionic共存时的TLS冲突的问题
    6 Open Source Mobile OS Alternatives To Android in 2018
    Using MultiROM
    GPU drivers are written by the GPU IP vendors and they only provide Android drivers
    Jolla Brings Wayland Atop Android GPU Drivers
    How to Use Libhybris and Android GPU Libraries with Mer (Linux) on the Cubieboard
    闲聊Libhybris
    【ARM-Linux开发】wayland和weston的介绍
    Wayland and X.org problem : Why not following the Android Solution ?
  • 原文地址:https://www.cnblogs.com/gojava/p/3372314.html
Copyright © 2011-2022 走看看