终断一个线程,可以用thread.interrupt( ) 和stop方法。
stop现在已经废弃,不推荐使用。
stop 是不安全的,通过与interrupt()的比较,可以看到stop是哪里不安全。
代码如下:
public class ThreadTest {
public static void main(String[] args) {
try {
System.out.println("try");
Thread thread = new MyThread();
thread.start();
thread.stop();
// thread.interrupt();
} catch (Exception e) {
System.out.println("exception");
} finally {
System.out.println("finally");
}
}
}
class MyThread extends Thread {
public void run() {
try {
System.out.println("run");
Thread.sleep(1000L);
throw new Exception();
} catch (Exception e) {
System.out.println("exception ");
}
}
}
console输出的结果是:
try
finally
可以看到,stop终结一个线程,并且释放监控线程的所有资源。对于主线程来说,并不能再跟踪线程的运行状况,当线程出现异常也不能被捕获。而其他线程并不知道被stop的线程出现了异常。这样导致状态不一致的情况产生。
注释掉stop 一行,换用interrupt,进行测试。输出结果是:
try
finally
run
exception
以下是jdk的英文。
/**
* 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>.
*
* @exception SecurityException if the current thread cannot
* modify this thread.
* @see #interrupt()
* @see #checkAccess()
* @see #run()
* @see #start()
* @see ThreadDeath
* @see ThreadGroup#uncaughtException(Thread,Throwable)
* @see SecurityManager#checkAccess(Thread)
* @see SecurityManager#checkPermission
* @deprecated This method is inherently unsafe. Stopping a thread with
* Thread.stop causes it to unlock all of the monitors that it
* has locked (as a natural consequence of the unchecked
* <code>ThreadDeath</code> exception propagating up the stack). If
* any of the objects previously protected by these monitors were in
* an inconsistent state, the damaged objects become visible to
* other threads, potentially resulting in arbitrary behavior. Many
* uses of <code>stop</code> should be replaced by code that simply
* modifies some variable to indicate that the target thread should
* stop running. The target thread should check this variable
* regularly, and return from its run method in an orderly fashion
* if the variable indicates that it is to stop running. If the
* target thread waits for long periods (on a condition variable,
* for example), the <code>interrupt</code> method should be used to
* interrupt the wait.
* For more information, see
* <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
* are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
*/
@Deprecated
public final void stop() {
// If the thread is already dead, return.
// A zero status value corresponds to "NEW".
if ((threadStatus != 0) && !isAlive()) {
return;
}
stop1(new ThreadDeath());
}
分享到:
相关推荐
但是需要注意的是,该方法已经被废弃,因为它可能导致资源泄漏等问题。使用`stop`方法可能会导致程序出现不稳定的情况。 ##### 3.2 方法签名 ```java public final void stop() ``` ##### 3.3 使用示例 下面是一个...
**示例代码**:将上述代码中的`stop()`方法替换为`interrupt()`方法。 #### 四、使用`volatile`标志位 另一种优雅地中止线程的方法是使用`volatile`修饰符声明一个布尔类型的标志位,作为线程是否继续执行的开关。...
`stop()`方法已废弃,因为它可能引发不安全的线程终止。通常,推荐通过修改线程内部的循环条件来停止线程。 6. `setPriority(int weight)`方法 此方法用于设置线程的优先级,范围从1到10。较高的优先级意味着线程更...
在Java多线程编程中,中断机制是一种优雅的线程停止策略,相比已废弃的`stop()`方法,中断机制提供了更安全、可控的方式来结束线程的执行。本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法...
在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. **中断线程(Interrupt)** 3...
使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期废弃的方法;使用interrupt方法中断线程。 三、notify和notifyAll的区别 notify和notifyAll都是用于线程间的通信的方法,但是...
旧版本的Java API中,`Thread.stop()`方法用于强制停止线程,但因为可能引发数据不一致和资源泄露问题,已被废弃。在上述代码中,注释掉的`a.stop();`就是这种不推荐的用法。 4. **`wait()`, `join()`, `sleep()`...
Thread.stop()方法是一个被废弃的方法,因为它太过于暴力,会强行把执行一半的线程终止,从而导致线程的资源不能正确释放。 2. 使用Thread.interrupt()方法安全退出线程 Thread.interrupt()方法可以安全地退出线程...
- **阻塞(Blocked)**: 线程进入阻塞状态的情况包括但不限于:调用`sleep()`方法、调用阻塞式I/O方法、尝试获取已被其他线程持有的锁、等待通知(`notify()`)、或调用已废弃的`suspend()`方法。其中,`suspend()`...
如果需要提前结束线程,Java提供了stop()方法(已废弃)和interrupt()方法。stop()方法不推荐使用,因为它可能破坏对象的状态。interrupt()方法更安全,它会设置线程的中断标志,线程内部可以通过检查isInterrupted...
Thread类的stop方法已经被废弃,因为它不能保证线程安全,且可能会导致资源未正确释放等问题。正确的做法是使用一个可控制线程退出的机制,如定义一个停止请求的标志位。以下是一个示例: ```java public class ...
#### 一、为什么不能强制停止线程? 在Java早期版本中,提供了`Thread.stop()`方法来直接终止线程,但这种方法存在严重的安全问题。例如,它可能会导致对象处于不稳定的状态,或者在对象的某些关键操作(如资源释放...
为什么不推荐使用 Thread.stop() 方法 在 Java 中,Thread.stop() 方法是一个被废弃的方法,不被推荐使用的原因是该方法太过于暴力,强行把执行到一半的线程终止,并且会立即释放这个线程所有的锁。这将破坏了线程...
因此,自Java 1.2版本起,`Thread.stop()`方法已被标记为废弃,并强烈建议开发者不要使用。 ### 推荐的线程关闭方式:标志位控制 示例代码中展示了一种更安全、更优雅的线程关闭策略——通过设置一个共享的标志位...
文件中提到了Thread的stop()方法和destroy()方法,但明确指出这两个方法是废弃的。在当前Java中,stop()方法会释放线程所持有的所有锁,可能导致数据不一致,而destroy()方法从未实现,因此在进行线程状态控制时,...
- `stop()`方法用于停止时钟更新线程,通过调用`Thread`的`stop()`方法(已废弃,但代码中依然使用),并重置`timeThread`为`null`。 4. **运行时钟更新逻辑**: - `run()`方法中包含了一个无限循环,通过`...
- `stop()`方法已废弃,因为它可能会导致数据不一致,现在通常推荐使用中断机制来停止线程。 - `yield()`让当前线程暂停,给其他相同优先级的线程执行机会。 2. **容器的布局管理**: - 在Java GUI编程中,`...
总结来说,Java中暂停或停止线程应谨慎处理,避免使用已废弃的Thread.stop(),而是采用协作的方式,如设置共享变量或利用中断标志。同时,wait()和notify()主要服务于线程间的同步,而不是简单的暂停操作。理解这些...
三是通过已被废弃的`stop()`方法强制结束线程。尽管`stop()`方法依然可用,但因为其可能导致数据不一致和资源泄露,所以在现代Java编程中应避免使用。 `join()`方法用于线程间的协作,它允许一个线程等待另一个线程...