`
中国爪哇程序员
  • 浏览: 167525 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

为什么废弃stop方法

 
阅读更多
终断一个线程,可以用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());
    }
分享到:
评论

相关推荐

    java线程中断之interrupt和stop.docx

    但是需要注意的是,该方法已经被废弃,因为它可能导致资源泄漏等问题。使用`stop`方法可能会导致程序出现不稳定的情况。 ##### 3.2 方法签名 ```java public final void stop() ``` ##### 3.3 使用示例 下面是一个...

    多线程之06三种中止线程的方法比较.docx

    **示例代码**:将上述代码中的`stop()`方法替换为`interrupt()`方法。 #### 四、使用`volatile`标志位 另一种优雅地中止线程的方法是使用`volatile`修饰符声明一个布尔类型的标志位,作为线程是否继续执行的开关。...

    线程的几个重要方法.doc

    `stop()`方法已废弃,因为它可能引发不安全的线程终止。通常,推荐通过修改线程内部的循环条件来停止线程。 6. `setPriority(int weight)`方法 此方法用于设置线程的优先级,范围从1到10。较高的优先级意味着线程更...

    JAVA多线程之中断机制stop()、interrupted()、isInterrupted()

    在Java多线程编程中,中断机制是一种优雅的线程停止策略,相比已废弃的`stop()`方法,中断机制提供了更安全、可控的方式来结束线程的执行。本文将深入探讨`stop()`, `interrupted()`以及`isInterrupted()`这三个方法...

    JAVA线程停止的方法

    在Java中,直接调用线程的`stop()`方法来终止线程已被废弃,因为这可能导致资源泄露、数据不一致等问题。取而代之的是,开发者通常采用以下几种策略: 1. **使用标志变量(Flag)** 2. **中断线程(Interrupt)** 3...

    Java多线程与并发系列22道高频面试题(附思维导图和答案解析)

    使用stop方法强行终止,但是不推荐这个方法,因为stop和suspend及resume一样都是过期废弃的方法;使用interrupt方法中断线程。 三、notify和notifyAll的区别 notify和notifyAll都是用于线程间的通信的方法,但是...

    java中终止一个线程的方法总结(精)

    旧版本的Java API中,`Thread.stop()`方法用于强制停止线程,但因为可能引发数据不一致和资源泄露问题,已被废弃。在上述代码中,注释掉的`a.stop();`就是这种不推荐的用法。 4. **`wait()`, `join()`, `sleep()`...

    Java多线程编程安全退出线程方法介绍

    Thread.stop()方法是一个被废弃的方法,因为它太过于暴力,会强行把执行一半的线程终止,从而导致线程的资源不能正确释放。 2. 使用Thread.interrupt()方法安全退出线程 Thread.interrupt()方法可以安全地退出线程...

    JAVA总结知识点.pdf

    - **阻塞(Blocked)**: 线程进入阻塞状态的情况包括但不限于:调用`sleep()`方法、调用阻塞式I/O方法、尝试获取已被其他线程持有的锁、等待通知(`notify()`)、或调用已废弃的`suspend()`方法。其中,`suspend()`...

    多线程程序设计

    如果需要提前结束线程,Java提供了stop()方法(已废弃)和interrupt()方法。stop()方法不推荐使用,因为它可能破坏对象的状态。interrupt()方法更安全,它会设置线程的中断标志,线程内部可以通过检查isInterrupted...

    JUC文档学习面试必问知识

    Thread类的stop方法已经被废弃,因为它不能保证线程安全,且可能会导致资源未正确释放等问题。正确的做法是使用一个可控制线程退出的机制,如定义一个停止请求的标志位。以下是一个示例: ```java public class ...

    java中 如何终止一个线程

    #### 一、为什么不能强制停止线程? 在Java早期版本中,提供了`Thread.stop()`方法来直接终止线程,但这种方法存在严重的安全问题。例如,它可能会导致对象处于不稳定的状态,或者在对象的某些关键操作(如资源释放...

    java安全停止线程的方法详解

    为什么不推荐使用 Thread.stop() 方法 在 Java 中,Thread.stop() 方法是一个被废弃的方法,不被推荐使用的原因是该方法太过于暴力,强行把执行到一半的线程终止,并且会立即释放这个线程所有的锁。这将破坏了线程...

    关闭线程.txt

    因此,自Java 1.2版本起,`Thread.stop()`方法已被标记为废弃,并强烈建议开发者不要使用。 ### 推荐的线程关闭方式:标志位控制 示例代码中展示了一种更安全、更优雅的线程关闭策略——通过设置一个共享的标志位...

    Java线程及多线程技术及应用.pdf

    文件中提到了Thread的stop()方法和destroy()方法,但明确指出这两个方法是废弃的。在当前Java中,stop()方法会释放线程所持有的所有锁,可能导致数据不一致,而destroy()方法从未实现,因此在进行线程状态控制时,...

    数字式时钟,java程序

    - `stop()`方法用于停止时钟更新线程,通过调用`Thread`的`stop()`方法(已废弃,但代码中依然使用),并重置`timeThread`为`null`。 4. **运行时钟更新逻辑**: - `run()`方法中包含了一个无限循环,通过`...

    javaSE2.20.试卷A及答案借鉴.pdf

    - `stop()`方法已废弃,因为它可能会导致数据不一致,现在通常推荐使用中断机制来停止线程。 - `yield()`让当前线程暂停,给其他相同优先级的线程执行机会。 2. **容器的布局管理**: - 在Java GUI编程中,`...

    Java中停止线程执行的方法

    总结来说,Java中暂停或停止线程应谨慎处理,避免使用已废弃的Thread.stop(),而是采用协作的方式,如设置共享变量或利用中断标志。同时,wait()和notify()主要服务于线程间的同步,而不是简单的暂停操作。理解这些...

    浅谈Java线程的生命周期——北大青鸟佳音旗舰.docx

    三是通过已被废弃的`stop()`方法强制结束线程。尽管`stop()`方法依然可用,但因为其可能导致数据不一致和资源泄露,所以在现代Java编程中应避免使用。 `join()`方法用于线程间的协作,它允许一个线程等待另一个线程...

Global site tag (gtag.js) - Google Analytics