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专业人才。学员毕业之后的代码量至少达到项目经理的水平。疯狂软件学院有完善的就业服务机制,学员毕业时,可以享受免费终身推荐就业服务。根据学员的特点和企业的要求,为学员推荐最合适的岗位。

  • 相关阅读:
    LeetCode#1047-Remove All Adjacent Duplicates In String-删除字符串中的所有相邻重复项
    LeetCode#345-Reverse Vowels of a String-反转字符串中的元音字母
    LeetCode#344-Reverse String-反转字符串
    LeetCode#232-Implement Queue using Stacks-用栈实现队列
    LeetCode#225-Implement Stack using Queues-用队列实现栈
    LeetCode#20-Valid Parentheses-有效的括号
    树的遍历
    [leetcode] 树(Ⅰ)
    二叉树图形化显示
    你错在成长于文明的边陲
  • 原文地址:https://www.cnblogs.com/gojava/p/3372314.html
Copyright © 2011-2022 走看看