多线程问题

05-12-11 hti
主要是holdResume()和run()这两个方法的实现有点不太明白,不知道如何让线程挂起后,重新启动

望有朋友能指教

class Counter implements Runnable {

// You might use these constants and variables.

private final int IDLE = 0, RUNNING = 1, HOLDING = 2;

private StartResumeStopApplication application;

private int value;

// The following variable is set whenever a new thread is created. It is

// set to null within the run() method whenever the thread executing the

// run() method terminates.

private Thread myThread = null;

Thread t = new Thread(this);

private int state = IDLE;

public Counter(StartResumeStopApplication app) {

value = 0;

application = app;

}

/**

* Upon applying method begin, its counter value is reset, a new thread

* object is created and a thread is started. Subsequent calls to this

* method take no effect unless method terminate has been called.

*/

public synchronized void begin() {

// TODO: Complete the begin() method.

// Set the Counter's state to RUNNING and start a thread.

// Ensure that only a single thread is started!

value = 0;

state = RUNNING;

System.out.println("state: "+state);

t.start();

}

/**

* Upon applying method holdResume, it looks like the counter were

* suspended/resumed. This method has no effect if the counter is in state

* IDLE.

*/

public synchronized void holdResume() {

// TODO: Complete the holdResume() method.

// We have two cases here:

// - we are in the RUNNING state:

// put ourselves into the HOLDING state

// - we are in the HOLDING state:

// put ourselves into the RUNNING state

if (state == 1) {

state = HOLDING;

System.out.println("state: "+state);

}

else

if (state == 2) {

state = RUNNING;

System.out.println("state: "+state);

begin();

}

}

/**

* Upon applying method terminate, the thread is terminated. Subsequent

* calls to this method take no effect unless method begin has been called.

*/

public synchronized void terminate() {

// TODO: Complete the terminate() method.

// Terminate the thread if this Counter object is in the RUNNING state.

// In any case set the Counter object state to IDLE.

if (state == 1)

t.interrupt();

state = IDLE;

System.out.println("state: "+state);

}

private void incr() {

value++;

if (application != null)

application.update(value);

}

public void run() {

// TODO: Complete the thread termination condition.

if (state == 2) {

holdResume();

System.out.println("state: "+state);

}

while (state==1) {

try {

Thread.sleep(100); // 1/10 second

incr();

} catch (InterruptedException e) {

// TODO: Complete the interrupt handler.

// We've been interrupted -- we terminate.

return;

}

}

// Set myThread to null so that control method can determine that

// we really have terminated.

myThread = null;

}

}

banq
2005-12-11 20:46
使用另外一个线程进行监察实现暂停和启动比较好,可参线程编程这本书。

猜你喜欢