============================================================================== | A P P E N D I X 3 | ============================================================================== //{{{ stamp Date: Tue, 14 May 1996 16:20:30 -0700 From: Gerald Hilderink To: occam-com@ukc.ac.uk Subject: Java solution of checking suspended threads ! //}}} phw wrote: > > > Can anyone help me with the following Java problem ... or point me at some > Java hot-line that answers technical questions? > > ... > > What I want to do is have one thread detect if another thread has been > suspended (... the first thread's task is to resume the second one, but it > musn't do so before the other has really suspended!). > > etc. The suspend method calls a checkAccess method which determines if the currently running thread has persmission to modify this thread. Only the checkAccess method throws the exception "ServiceException". To check if a thread is suspended is not implemented. Here I wrote a program, based on the program of Peter Welch, where an isSuspended() method returns true is the thread is suspended. To do this the original suspend() and resume() methods are extended with the condition variable "suspendflag". Overriding suspend() and resume() is not possible because they are defined as final. So I wrote the methods Suspend() and Resume(). /** * ThingTest.java **/ import java.io.*; import java.util.*; import java.lang.*; class Thing extends Thread { private boolean suspendflag = false; public Thing () { setName ("Thing"); start (); } public void run () { System.out.println (" " + getName() + " " + toString()); System.out.println ("(timestamp = " + System.currentTimeMillis() + ")" + " Thing: suspending ..."); this.Suspend(); System.out.println ("(timestamp = " + System.currentTimeMillis() + ")" + " Thing: resumed ..."); } public void Suspend() { suspendflag = true; super.suspend(); } public void Resume() { suspendflag = false; super.resume(); } public boolean isSuspended() { return suspendflag; } } class ThingTest { public static void main (String argv []) { Thing thing = new Thing (); try { Thread.sleep (5000); } catch (InterruptedException e) { } if (thing.isSuspended()) System.out.println("(1) Suspended !"); else System.out.println("(1) NOT suspended !"); thing.Resume (); if (thing.isSuspended()) System.out.println("(2) Suspended !"); else System.out.println("(2) NOT suspended !"); try { thing.join (); } catch (InterruptedException ignored) {} } } Regards, Gerald Hilderink.