Suspending, Resuming, and Stopping Threads Using Java 2
While the suspend ( ), resume( ), and stop( ) methods defined by Thread seem to be a perfectly reasonable and convenient approach to managing the execution of threads, they must not be used (or new Java programs. Here's why. 'The suspend () method of the Thread class is deprecated in Java 2. This was done because suspend() can sometimes cause serious system failures. Assume that a thread has obtained locks on critical data structures. If that thread is suspended at that point; those 10Lks are not : relinquished. Other threads that may be waiting for those resources can be deadlocked.
The resume( ) method is also deprecated. It docs not cause problems, but cannot be used without the suspend( ) method as its counterpart.
The stop( ) method of the Thread class, too, is deprecated in Java Z. This was done because this method can sometimes cause serious system failures. Assume that a thread is writing to a critically important data structure and has completed only part of its changes. If that thread is stopped at that point, that data structure might be kit in a corrupted state. Because you can't use the suspend( ), resume ( ), or stop( ) methods in Java 2 to control a thread, you might be thinking that no way exists to pause, restart, or terminate a 'thread. But, fortunately, this is not true. Instead, a thread must be designed so that the run( ) method periodically checks to determine whether that thread should suspend, resume, or stop its own execution .Typically, this is accomplished by. establishing a flag variable that indicates the execution state of the road As long as this flag is set to "running," the runt ) method must continue to let the thread execute. If this variable is set to "suspend':' the thread must pause. If it is set to "stop," the. thread must terminate. Of course, a variety of ways exist in which to write such code, 'but the central theme will be the same for all programs. The following example illustrates how the.' wail() and notify() methods that are inherited from Object can be used to control the execution of a tin-cad. This example is similar to the program in the previous section. However, the deprecated method calls have been removed. Let us consider the operation of this program. . The NewThread class contains a boolean instance variable named suspcndlilag. which is. used to control the execution of the thread. It is mitiulizcd to false by the constructor. The run( ) method contains a synchronized statement block that checks suspendl'lag. If that variable is lrue, the wait( ) method is invoked to suspend the execution of the thread. Theznysuspcndt ) method sets auspcndf'lag to true. The myrcsumcl ) method sets suspense Flag to false and invokes notify() to wake lip till.! thread. Finally, the maint ) method has been modified to invoke the mysuspendt ) and myrcsumc( ) methods.
The output from this program is iden"Jincallo that shown in the previous section, Later ir. this book, you will see more examples thAt use the new, java L mechanism \)f thread control Although this mechanism isn't a:;"clean" as the previous WHy. 11 vcr the less, it is the way required to ensure that run-lime errors don't appr ach that of be used for all new code.