概述
这一章节我们来讨论一下暴力Stop方法。
1.使用样例
package com.ray.deepintothread.ch01.topic_8;
public class StopByStopMethod {
@SuppressWarnings("deprecation")
public static void main(String[] args) throws InterruptedException {
ThreadFive threadFive = new ThreadFive();
threadFive.start();
Thread.sleep(200);
threadFive.stop();
}
}
class ThreadFive extends Thread {
@Override
public void run() {
System.out.println("------------begin-------------");
try {
System.out.println("------------working-------------");
sleep(2000);
} catch (InterruptedException e) {
System.out.println("------------exit-------------");
}
super.run();
}
}
输出:
------------begin-------------
------------working-------------
2.这是一个java弃用的方法,使用它的时候存在重大隐患
以下是引用java的api里面的原文
* Forces the thread to stop executing.
* <p>
* If there is a security manager installed, its <code>checkAccess</code>
* method is called with <code>this</code>
* as its argument. This may result in a
* <code>SecurityException</code> being raised (in the current thread).
* <p>
* If this thread is different from the current thread (that is, the current
* thread is trying to stop a thread other than itself), the
* security manager's <code>checkPermission</code> method (with a
* <code>RuntimePermission("stopThread")</code> argument) is called in
* addition.
* Again, this may result in throwing a
* <code>SecurityException</code> (in the current thread).
* <p>
* The thread represented by this thread is forced to stop whatever
* it is doing abnormally and to throw a newly created
* <code>ThreadDeath</code> object as an exception.
* <p>
* It is permitted to stop a thread that has not yet been started.
* If the thread is eventually started, it immediately terminates.
* <p>
* An application should not normally try to catch
* <code>ThreadDeath</code> unless it must do some extraordinary
* cleanup operation (note that the throwing of
* <code>ThreadDeath</code> causes <code>finally</code> clauses of
* <code>try</code> statements to be executed before the thread
* officially dies). If a <code>catch</code> clause catches a
* <code>ThreadDeath</code> object, it is important to rethrow the
* object so that the thread actually dies.
* <p>
* The top-level error handler that reacts to otherwise uncaught
* exceptions does not print out a message or otherwise notify the
* application if the uncaught exception is an instance of
* <code>ThreadDeath</code>.
大致的意思:
(1)当程序调用security manager的时候,会额外的运行checkPermission方法
(2)当程序调用security manager,会抛出SecurityException这样的安全异常
(3)隐式抛ThreadDeath异常
(4)同意stop那些还没有開始的线程
(5)即便那些线程启动了。也会立马终止
等等,还有几个
因此。这种方法终于被java弃用。
我们来演示一下第三个原因,由于其它的几个比較难通过一个样例就行说清楚。
package com.ray.deepintothread.ch01.topic_8;
public class CatchThreadDeath {
public static void main(String[] args) throws InterruptedException {
ThreadOne threadOne = new ThreadOne();
threadOne.start();
Thread.sleep(200);
}
}
class ThreadOne extends Thread {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
this.stop();
} catch (ThreadDeath e) {
System.out.println(e);
}
super.run();
}
}
输出:
java.lang.ThreadDeath
总结:这一章节我们来讨论了一下暴力stop线程,然后描写叙述了一下他的原因。
我的github:https://github.com/raylee2015/DeepIntoThread
最后
以上就是纯情黑米为你收集整理的从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法的全部内容,希望文章能够帮你解决从头认识多线程-1.8 迫使线程停止的方法-暴力Stop方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复