关键词:
Java 1.1或更早版本的线程的挂起、恢复和终止
Java 2中挂起、恢复和终止线程
Thread定义的suspend(),resume()和stop()方法看起来是管理线程的完美的和方便的方法,它们不能用于新Java版本的程序。下面是其中的原因。Thread类的suspend()方法在Java2中不被赞成,因为suspend()有时会造成严重的系统故障。假定对关键的数据结构的一个线程被锁定的情况,如果该线程在那里挂起,这些锁定的线程并没有放弃对资源的控制。其他的等待这些资源的线程可能死锁。
Resume()方法同样不被赞同。它不引起问题,但不能离开suspend()方法而独立使用。Thread类的stop()方法同样在Java 2中受到反对。这是因为该方法可能导致严重的系统故障。设想一个线程正在写一个精密的重要的数据结构且仅完成一个零头。如果该线程在此刻终止,则数据结构可能会停留在崩溃状态。
因为在Java 2中不能使用suspend(),resume()和stop() 方法来控制线程,你也许会想那就没有办法来停止,恢复和结束线程。其实不然。相反,线程必须被设计以使run() 方法定期检查以来判定线程是否应该被挂起,恢复或终止它自己的执行。有代表性的,这由建立一个指示线程状态的标志变量来完成。只要该标志设为“running”,run()方法必须继续让线程执行。如果标志为“suspend”,线程必须暂停。若设为“stop”,线程必须终止。
当然,编写这样的代码有很多方法,但中心主题对所有的程序应该是相同的。
下面的例题阐述了从Object继承的wait()和notify()方法怎样控制线程的执行。该例与前面讲过的程序很像。然而,不被赞同的方法都没有用到。让我们思考程序的执行。
NewTread 类包含了用来控制线程执行的布尔型的实例变量suspendFlag。它被构造函数初始化为false。Run()方法包含一个监测suspendFlag 的同步声明的块。如果变量是true,wait()方法被调用以挂起线程。Mysuspend()方法设置suspendFlag为true。Myresume()方法设置suspendFlag为false并且调用notify()方法来唤起线程。最后,main()方法被修改以调用mysuspend()和myresume()方法。
// Suspending and resuming a thread for Java2
class NewThread implements Runnable {
String name; // name of thread
Thread t;
boolean suspendFlag;
NewThread(String threadname) {
name = threadname;
t = new Thread(this, name);
System.out.println("New thread: " + t);
suspendFlag = false;
t.start(); // Start the thread
}
// This is the entry point for thread feifanyule.cn .
public void run() {
try {
for(int i = 15; i > 0; i--) {
System.out.println(name + ": " + i);
Thread.sleep(200);
synchronized(this) {
while(suspendFlag) {
wait();
}
}
}
} catch (InterruptedException e) {
System.out.println(name + " interrupted.");
}
System.out.println(name + " exiting.");
}
void mysuspend() {
suspendFlag = true;
}
synchronized void myresume() {
suspendFlag = false;
notify();
}
}
class SuspendResume {
public static void main(String args[]) {
NewThread ob1 = new NewThread("One");
NewThread ob2 = new NewThread("Two");
try {
Thread.sleep(1000);
ob1.mysuspend();
System.out.println("Suspending thread One");
Thread.sleep(1000);
ob1.myresume();
System.out.println("Resuming thread One");
ob2.mysuspend();
System.out.println("Suspending thread Two");
Thread.sleep(1000);
ob2.myresume();
System.out.println("Resuming thread Two");
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
// wait for threads to finish
try {
System.out.println("Waiting for threads to finish.");
ob1.t.join();
ob2.t.join();
} catch (InterruptedException e) {
System.out.println("Main thread Interrupted");
}
System.out.println("Main thread exiting.");
}
}
该程序的输出与前面的程序相同。此书的后面部分,你将看到用Java 2机制控制线程的更多例子。尽管这种机制不像老方法那样“干净”,然而,它是确保运行时不发生错误的方法。它是所有新的代码必须采用的方法。
线程的挂起和恢复转载
(1)概述:线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。在线程挂起后,可以通过重新唤醒线程来使之恢复运行。  ... 查看详情
java并发编程:线程挂起恢复与终止的正确方法(含代码)
JAVA大数据中高级架构2018-11-0614:24:56挂起和恢复线程Thread的API中包含两个被淘汰的方法,它们用于临时挂起和重启某个线程,这些方法已经被淘汰,因为它们是不安全的,不稳定的。如果在不合适的时候挂起线程(比如,锁定共... 查看详情
如何正确终止 dll 中的挂起线程?
】如何正确终止dll中的挂起线程?【英文标题】:Howtoterminateahangingthreadinsideadllcorrectly?【发布时间】:2009-06-1701:30:08【问题描述】:大家好,我有一个包含错误的第三方库。当我调用一个函数时,它可能会挂起。库函数在dll中调... 查看详情
kotlin协程协程的挂起和恢复②(协程挂起和线程阻塞对比)(代码片段)
文章目录一、协程挂起和线程阻塞对比1、协程挂起2、线程阻塞3、挂起和阻塞对UI的影响4、挂起分析一、协程挂起和线程阻塞对比挂起是协程中的概念,只能在协程中使用;阻塞是线程中的概念,可以在主线程和子线程中使用;1、协... 查看详情
kotlin协程协程的挂起和恢复②(协程挂起和线程阻塞对比)(代码片段)
文章目录一、协程挂起和线程阻塞对比1、协程挂起2、线程阻塞3、挂起和阻塞对UI的影响4、挂起分析一、协程挂起和线程阻塞对比挂起是协程中的概念,只能在协程中使用;阻塞是线程中的概念,可以在主线程和子线程中使用;1、协... 查看详情
检测终止的挂起应用程序
...集相关信息。但是我似乎无法弄清楚如何检测这种情况。线程和进程退出代码保持在0。有一次我以为它们返回0xCFF 查看详情
一文搞明白协程的挂起和恢复(代码片段)
协程是使用非阻塞式挂起的方式来实现线程运行的。那协程又是如何挂起和恢复的,这里面的概念又是什么,带着这些问题就让我们重新探究下协程的挂起和恢复。我们先创建个协程:overridefuninitView()lifecycleScope.launch... 查看详情
一文搞明白协程的挂起和恢复(代码片段)
协程是使用非阻塞式挂起的方式来实现线程运行的。那协程又是如何挂起和恢复的,这里面的概念又是什么,带着这些问题就让我们重新探究下协程的挂起和恢复。我们先创建个协程:overridefuninitView()lifecycleScope.launch... 查看详情
如何在 C++ 中暂停和恢复 POSIX 线程?
】如何在C++中暂停和恢复POSIX线程?【英文标题】:HowtosuspendandresumeaPOSIXthreadinC++?【发布时间】:2018-06-1213:45:31【问题描述】:据我所知,突然创建和终止线程每次都使用pthread_kill()不是一个好方法,所以我要去使用thread1.suspend()... 查看详情
自动线程恢复 C++
】自动线程恢复C++【英文标题】:AutoThreadresumec++【发布时间】:2018-06-1307:53:30【问题描述】:我为游戏构建了简单的Anticheat模块,我需要保护线程免受挂起(如来自Processhacker的挂起线程)。如果线程被挂起,有什么方法可以自... 查看详情
七.多线程编程7.线程优先级
线程优先级被线程调度用来判定何时每个线程允许运行。理论上,优先级高的线程比优先级低的线程获得更多的CPU时间。实际上,线程获得的CPU时间通常由包括优先级在内的多个因素决定(例如,一个实行多任务处理的操作系统... 查看详情
一文搞明白协程的挂起和恢复(代码片段)
协程是使用非阻塞式挂起的方式来实现线程运行的。那协程又是如何挂起和恢复的,这里面的概念又是什么,带着这些问题就让我们重新探究下协程的挂起和恢复。我们先创建个协程:overridefuninitView()lifecycleScope.launch... 查看详情
整理c#多线程常用的几个对象和方法(代码片段)
...hread几个中要的方法 Sleep(int):静态方法,暂停当前线程指定的毫秒数 Abort():通常使用该方法来终止一个线程 ,Thread.ResetAbort()可以恢复终止的线程 Suspend():不是终止未完成的线程,它仅仅是挂起线程,还... 查看详情
kotlin协程协程的挂起和恢复①(协程的挂起和恢复概念|协程的suspend挂起函数)(代码片段)
文章目录一、协程的挂起和恢复概念二、协程的suspend挂起函数一、协程的挂起和恢复概念函数最基本的操作是:调用call:通过函数名或函数地址调用函数;返回return:函数执行完毕后,继续执行函数调用的下一行代码;协程在调用call和... 查看详情
kotlin协程协程的挂起和恢复①(协程的挂起和恢复概念|协程的suspend挂起函数)(代码片段)
文章目录一、协程的挂起和恢复概念二、协程的suspend挂起函数一、协程的挂起和恢复概念函数最基本的操作是:调用call:通过函数名或函数地址调用函数;返回return:函数执行完毕后,继续执行函数调用的下一行代码;协程在调用call和... 查看详情
整理c#多线程常用的几个对象和方法(代码片段)
...hread几个中要的方法 Sleep(int):静态方法,暂停当前线程指定的毫秒数 Abort():通常使用该方法来终止一个线程 ,Thread.ResetAbort()可以恢复终止的线程 Suspend():不是终止未完成的线程,它仅仅是挂起线程,还... 查看详情
整理c#多线程常用的几个对象和方法(代码片段)
...hread几个中要的方法 Sleep(int):静态方法,暂停当前线程指定的毫秒数 Abort():通常使用该方法来终止一个线程 ,Thread.ResetAbort()可以恢复终止的线程 Suspend():不是终止未完成的线程,它仅仅是挂起线程,还... 查看详情
七.多线程编程6.isalive()和join()的使用
如前所述,通常你希望主线程最后结束。在前面的例子中,这点是通过在main()中调用sleep()来实现的,经过足够长时间的延迟以确保所有子线程都先于主线程结束。然而,这不是一个令人满意的解决方法,它也带来一个大问题:... 查看详情