While the suspend( ), resume( ), and stop( ) methods defined by Thread class seem to be a perfectly reasonable and convenient approach to managing the execution of threads,
they must not be used for new Java programs and obsolete in newer versions of Java.
The following example illustrates how the wait( ) and notify( ) methods that are inherited from Object can be used to control the execution of a thread.
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.
class MyThread implements Runnable
{
Thread thrd;
boolean suspended;
boolean stopped;
MyThread(String name) {
thrd = new Thread(this, name);
suspended = false;
stopped = false;
thrd.start();
}
public void run() {
try {
for (int i = 1; i < 10; i++) {
System.out.print(".");
Thread.sleep(50);
synchronized (this) {
while (suspended)
wait();
if (stopped)
break;
}
}
} catch (InterruptedException exc) {
System.out.println(thrd.getName() + " interrupted.");
}
System.out.println("\n" + thrd.getName() + " exiting.");
}
synchronized void stop() {
stopped = true;
suspended = false;
notify();
}
synchronized void suspend() {
suspended = true;
}
synchronized void resume() {
suspended = false;
notify();
}
}
public class Maincode
{
public static void main(String args[]) throws Exception {
MyThread mt = new MyThread("MyThread");
Thread.sleep(100);
mt.suspend();
Thread.sleep(100);
mt.resume();
Thread.sleep(100);
mt.suspend();
Thread.sleep(100);
mt.resume();
Thread.sleep(100);
mt.stop();
}
}
G:\>javac Maincode.java
G:\>java Maincode
.........
MyThread exiting.
The following example illustrates how the wait( ) and notify( ) methods that are inherited from Object can be used to control the execution of a thread.
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.
class MyThread implements Runnable
{
Thread thrd;
boolean suspended;
boolean stopped;
MyThread(String name) {
thrd = new Thread(this, name);
suspended = false;
stopped = false;
thrd.start();
}
public void run() {
try {
for (int i = 1; i < 10; i++) {
System.out.print(".");
Thread.sleep(50);
synchronized (this) {
while (suspended)
wait();
if (stopped)
break;
}
}
} catch (InterruptedException exc) {
System.out.println(thrd.getName() + " interrupted.");
}
System.out.println("\n" + thrd.getName() + " exiting.");
}
synchronized void stop() {
stopped = true;
suspended = false;
notify();
}
synchronized void suspend() {
suspended = true;
}
synchronized void resume() {
suspended = false;
notify();
}
}
public class Maincode
{
public static void main(String args[]) throws Exception {
MyThread mt = new MyThread("MyThread");
Thread.sleep(100);
mt.suspend();
Thread.sleep(100);
mt.resume();
Thread.sleep(100);
mt.suspend();
Thread.sleep(100);
mt.resume();
Thread.sleep(100);
mt.stop();
}
}
Output
G:\>javac Maincode.java
G:\>java Maincode
.........
MyThread exiting.
0 comments:
Post a Comment