关于java:Java如何停止线程

9次阅读

共计 1455 个字符,预计需要花费 4 分钟才能阅读完成。

 Java 中进行线程的准则是什么?

在 Java 中, 最好的进行线程的形式是应用中断 interrupt, 然而这仅仅是会告诉到被终止的线程 “ 你该进行运行了 ”, 被终止的线程本身领有决定权 (决定是否、以及何时进行), 这依赖于申请进行方和被进行方都恪守一种约定好的编码标准.

  • 工作和线程的启动很容易. 在大多数时候, 咱们都会让它们运行直到完结, 或者让它们自行进行. 然而, 有时候咱们心愿提前结束工作或线程, 或者是因为用户勾销了操作, 或者服务须要被疾速敞开, 或者是运行超时或出错了.
  • 要使工作和线程能平安、疾速、牢靠地停止下来, 并不是一件容易的事. Java 没有提供任何机制来平安地终止线程. 但它提供了中断 (Interruption), 这是一种合作机制, 可能使一个线程终止另一个线程的当前工作.
  • 这种合作式的办法是必要的, 咱们很少心愿某个工作、线程或服务立刻进行, 因为这种立刻进行会使共享的数据结构处于不统一的状态. 相同, 在编写工作和服务时能够应用一种合作的形式: 当须要进行时, 它们首先会革除以后正在执行的工作, 而后再完结. 这提供了更好的灵活性, 因为工作自身的代码比收回勾销申请的代码更分明如何执行革除工作.
  • 生命周期完结 (End-of-Lifecycle) 的问题会使工作、服务以及程序的设计和实现等过程变得复杂, 而这个在程序设计中十分重要的因素却常常被疏忽. 一个在行为良好的软件与勉强运的软件之间的最次要区别就是, 行为良好的软件能很欠缺地解决失败、敞开和勾销等过程.

 解决中断的最好办法是什么?

优先选择在办法上抛出异样.

用 throws InterruptedException 标记你的办法, 不采纳 try 语句块捕捉异样, 以便于该异样能够传递到顶层, 让 run 办法能够捕捉这一异样, 例如:

void subTask() throws InterruptedException
    sleep(delay);
}

因为 run 办法内无奈抛出 checked Exception (只能用 try catch), 顶层办法必须解决该异样, 防止了漏掉或者被吞掉的状况, 加强了代码的健壮性.

 如果不能抛出中断, 要怎么做?

如果不想或无奈传递 InterruptedException (例如用 run 办法的时候, 就不让该办法 throws InterruptedException), 那么应该抉择在 catch 子句中调用 Thread.currentThread().interrupt() 来复原设置中断状态, 以便于在后续的执行仍然可能查看到方才产生了中断.

代码演示详见视频, 在这里, 线程在 sleep 期间被中断, 并且由 catch 捕捉到该中断, 并从新设置了中断状态, 以便于能够在下一个循环的时候检测到中断状态, 失常退出.

 为什么用 volatile 进行线程不够全面?

解答: 这种做法是谬误的, 或者说是不够全面的, 在某些状况下尽管可用, 然而某些状况下有重大问题。

这种办法在《Java 并发编程实战》中被明确指出了缺点, 咱们一起来看看缺点在哪里:

此办法谬误的起因在于, 如果咱们遇到了线程长时间阻塞 (这是一种很常见的状况, 例如生产者消费者模式中就存在这样的状况), 就没方法及时唤醒它, 或者永远都无奈唤醒该线程, 而 interrupt 设计之初就是把 wait 等长期阻塞作为一种非凡状况思考在内了, 咱们应该用 interrupt 思维来进行线程.

正文完
 0