如何终止一个java线程

原创 2018年04月17日 21:44:42

线程,相比进程更加轻量级,系统开销更小,但过多的线程因系统资源占用多,导致系统性能下降,因此有关线程的管理不得不去做。

在java中如何创建线程呢?相比这样的文章都已多如牛毛,笔者在这里只简单的重述一下。

常见的有两种方式:

1.继承Thread类并重写run方法

2.实现Runnable接口,通过 new Thread(runnableImpl)方式

第2中方式显得更加的灵活,也是经常被采用的方式,第一种方式之所以不灵活主要是因为java中只有单继承,但可以实现多个接口,倘若采用第一种方式,如果你需要继承别的类,此时便无法做到了,起码是无法优雅的做到。。。。


回到正题,怎样终止一个线程呢?

笔者曾经面试被问到过这个问题,当时笔者听到这个问题一脸懵逼,不知如何作答是好,耿直的笔者也没有询问面试官该如何做(哭),之后笔者再网上也是搜了很多关于这个问题的答案,现结合自己的理解,进行整理一下。

如果你的线程仅仅是做一次性的任务,那任务执行完之后线程便会终止,这里讨论的当然不是这种场景下的线程。

Thread 类有提供 stop方法,但此方法已被标记过时,也不推荐使用,因此,如果想通过此方法终止线程的话,那么这个‘梦想’可以破灭了,读者可以完全忘记有这样的方法。

废话不多说了,直接上代码。


第一种方式,通过定义标识变量来终止线程

private boolean done = false;

@Override
public void run() {
   while (done){
      // TODO something
   }
}

这里仅仅是简单的demo,具体情境,具体业务,请读者自行设计和应用,工作远比demo更复杂,更困难。

这种方式简单高效,灵活性极强。


第二种方式,通过线程中断来终止线程

首先笔者需要强调一下,这种方式适合于开发者能控制线程的场景,即能够直接操作Thread对象,如果开发者使用线程池,终止某个线程可能比较困难,甚至根本无法做到

代码如下:

Thread t1 = new Thread(new Runnable() {

   private boolean done = false;

   @Override
   public void run() {
      while (true){

         if(Thread.currentThread().isInterrupted()){
            break;
         }

         // TODO somthing 反复做某件事(假设不会抛异常)
         
         try {
            Thread.sleep(200);
         }catch (InterruptedException ex){

            // 查看线程中断标记状态
            System.out.println(Thread.currentThread().isInterrupted());

            // 重新设置线程中断标记,注意不要与Thread.interrupted()搞混,此方法也会清除线程中断标记
            // 具体参见其注释
            Thread.currentThread().interrupt();
         }
      }
   }
});

t1.start();
try {
   Thread.sleep(1000);

   // 中断线程
   t1.interrupt();
}catch (Exception e){

}

如上所示, catch块的线程中断标记会打印出 false,读者可自行测试一下,具体详情可查看源码注释了解更多。

(如在线程内部没有调用会抛出InterruptedException的方法如sleep方法等(将该异常包装成RuntimeException重新抛出的方法除外),可以不用调用线程对象的 interrupt()方法)

内容到此为止,水平有限,如有错误还请谅解和加以指正。

学无止境,共同进步。









Java如何优雅的终止线程

简单介绍了下线程,并列出了终止线程的几种方法,希望大家可以参考参考,不足之处望指正。...
  • rainmonth
  • rainmonth
  • 2017-03-23 16:45:42
  • 1669

如何终止java线程

终止线程的三种方法      有三种方法可以使终止线程。      1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。      2.  使用stop方法强行终...
  • anhuidelinger
  • anhuidelinger
  • 2013-09-16 19:51:37
  • 161960

Java中如何正确的终止线程

1、Java中API自带的stop()方法,来终止线程         查阅JDK,不难发现Thread提供了一个stop()方法,但是stop()方法是一个被废弃的方法。为什么stop()方法被废弃...
  • zbw18297786698
  • zbw18297786698
  • 2016-12-02 11:42:43
  • 14389

java多线程编程--如何终止一个线程

1. Thread.stop()函数 stop()函数终止线程就像是强行拔掉电源线关机一样,可能会带来未知风险,因此目前不再推荐使用这种方式。请忘记它吧~~ 2. 改变标志变量状态 通常我们会在线...
  • Linux2_SCDN
  • Linux2_SCDN
  • 2015-08-28 15:41:59
  • 5349

如何安全的终止java线程

JDK1.5以后,stop(),destroy()方法已经被sun标明了已过时,不推荐使用了!!中止线程一般来说,最好的是在run()方法里写一个while(true){}死循环,然后加上判断条件,超...
  • shihuacai
  • shihuacai
  • 2014-06-30 09:24:33
  • 865

Java中安全终止线程的方法

1.早期Java提供java.lang.Thread类型包含了一些列的方法start(), stop(), stop(Throwable) and suspend(), destroy() and r...
  • cxq234843654
  • cxq234843654
  • 2015-03-30 17:01:51
  • 768

关于java中怎么终止一个线程的执行

其实现在要对一个循环执行的线程关闭,对循环执行体设置执行标志是常见的方法。另外一种方法是使用interrupt方法中断线程方式关闭线程。使用interrupt方法中断线程来退出线程sleep wait...
  • JQ_AK47
  • JQ_AK47
  • 2016-10-15 22:54:06
  • 2257

Java停止一个线程的几种方法

Java中停止一个线程有三种方法,分别是stop,interrupt和设置标志位,我们依次来看一下这三种方法。 首先不推荐使用stop方法,原因有两点: 1、原则上只要一调用thread.stop()...
  • yyd19921214
  • yyd19921214
  • 2015-11-07 22:26:11
  • 2873

Java中如何正确而优雅的终止运行中的线程

Java中终止线程的方式主要有三种: 1、使用stop()方法,已被弃用。原因是:stop()是立即终止,会导致一些数据被到处理一部分就会被终止,而用户并不知道哪些数据被处理,哪些没有被处理,产生了...
  • zhangliangzi
  • zhangliangzi
  • 2016-09-09 10:42:21
  • 6856

如何终止Java线程

原文地址:http://blog.csdn.net/anhuidelinger/article/details/11746365    终止线程的三种方法      有三种方法可以使终止线程。  ...
  • tanga842428
  • tanga842428
  • 2016-10-02 11:03:09
  • 1515
收藏助手
不良信息举报
您举报文章:如何终止一个java线程
举报原因:
原因补充:

(最多只允许输入30个字)