黑马程序员技术交流社区

标题: 请教一个比较模糊的问题,关于线程控制.. [打印本页]

作者: 李天甲    时间: 2012-6-28 12:54
标题: 请教一个比较模糊的问题,关于线程控制..
本帖最后由 李天甲 于 2012-6-28 16:19 编辑

看了视频,在多线程的环节有一个小问题
如果我们启动一个线程可以用start()方法来启动...
然后线程里面run方法包含一个无线循环.
但是这样一来,不知道怎么停止这个线程了.
老师说控制线程里面run方法中循环的条件,退出循环就行是么?

但是请问,目前知道的stop()貌似已过时,有没有其他的途径能够将线程停止呢?
还是我的思路不对,没有这样的操作呢.

版主说"杀死线程除了操作系统方式就只能是让run方法结束"

疑惑解决...

作者: 王健    时间: 2012-6-28 13:23
stop
@Deprecated
public final void stop()
    已过时。 该方法具有固有的不安全性。用 Thread.stop 来终止线程将释放它已经锁定的所有监视器(作为沿堆栈向上传播的未检查 ThreadDeath 异常的一个自然后果)。如果以前受这些监视器保护的任何对象都处于一种不一致的状态,则损坏的对象将对其他线程可见,这有可能导致任意的行为。stop 的许多使用都应由只修改某些变量以指示目标线程应该停止运行的代码来取代。目标线程应定期检查该变量,并且如果该变量指示它要停止运行,则从其运行方法依次返回。如果目标线程等待很长时间(例如基于一个条件变量),则应使用 interrupt 方法来中断该等待。有关更多信息,请参阅《为何不赞成使用 Thread.stop、Thread.suspend 和 Thread.resume?》。
    强迫线程停止执行。
    如果安装了安全管理器,则以 this 作为其参数调用 checkAccess 方法。这可能引发 SecurityException(在当前线程中)。
    如果该线程不同于当前线程(即当前线程试图终止除它本身以外的某一线程),则安全管理器的 checkPermission 方法(带有 RuntimePermission("stopThread") 参数)也会被调用。这会再次抛出 SecurityException(在当前线程中)。
    无论该线程在做些什么,它所代表的线程都被迫异常停止,并抛出一个新创建的 ThreadDeath 对象,作为异常。
    停止一个尚未启动的线程是允许的。如果最后启动了该线程,它会立即终止。
    应用程序通常不应试图捕获 ThreadDeath,除非它必须执行某些异常的清除操作(注意,抛出 ThreadDeath 将导致 try 语句的 finally 子句在线程正式终止前执行)。如果 catch 子句捕获了一个 ThreadDeath 对象,则重新抛出该对象很重要,因为这样该线程才会真正终止。
    对其他未捕获的异常作出反应的顶级错误处理程序不会打印输出消息,或者另外通知应用程序未捕获到的异常是否为 ThreadDeath 的一个实例。
    抛出:
        SecurityException - 如果当前线程不能修改该线程。
    另请参见:
        interrupt(), checkAccess(), run(), start(), ThreadDeath, ThreadGroup.uncaughtException(java.lang.Thread, java.lang.Throwable), SecurityManager.checkAccess(Thread), SecurityManager.checkPermission(java.security.Permission)
作者: 常佳杰    时间: 2012-6-28 13:28
API里边有说的...
作者: 李天甲    时间: 2012-6-28 14:41
常佳杰 发表于 2012-6-28 13:28
API里边有说的...

那么,有没有方法能够直接终止线程呢?请教
作者: 常佳杰    时间: 2012-6-28 14:45
stop() 和 close() 两种
作者: 刘蕴学    时间: 2012-6-28 14:53
异常的休眠和唤醒,这个方法比较好用
作者: 李天甲    时间: 2012-6-28 16:18
嗯,跟版主聊了一会,了解了.
版主说
"杀死线程除了操作系统方式就只能是让run方法结束"
了解,解决该问题...




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2