Java Tutorial/Thread/Wait Notify
Содержание
Monitor a thread"s status.
<source lang="java">
class MyThread extends Thread{
boolean waiting= true; boolean ready= false; public void run() { String thrdName = Thread.currentThread().getName(); System.out.println(thrdName + " starting."); while(waiting) System.out.println("waiting:"+waiting); System.out.println("waiting..."); startWait(); try { Thread.sleep(10000); } catch(Exception exc) { System.out.println(thrdName + " interrupted."); } System.out.println(thrdName + " terminating."); } synchronized void startWait() { try { while(!ready){ wait(); } } catch(InterruptedException exc) { System.out.println("wait() interrupted"); } } synchronized void startWork() { ready = true; notify(); }
} public class Main {
public static void main(String args[]) throws Exception{ MyThread thrd = new MyThread(); thrd.setName("MyThread #1"); System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() ); thrd.start(); Thread.sleep(50); System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() ); thrd.waiting = false; Thread.sleep(50); System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() ); thrd.startWork(); Thread.sleep(50); System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() ); if(thrd.isAlive()) System.out.println("alive"); System.out.println(thrd.getName()+" Alive:"+thrd.isAlive()+" State:" + thrd.getState() ); }
}</source>
Pausing a Thread: set boolean a variable that the thread checks occasionally
<source lang="java">
public class Main {
public static void main(String[] argv) throws Exception { MyThread thread = new MyThread(); thread.start(); while (true) { synchronized (thread) { thread.pause = true; } synchronized (thread) { thread.pause = false; thread.notify(); } } }
} class MyThread extends Thread {
boolean pause = false; public void run() { while (true) { synchronized (this) { while (pause) { try { wait(); } catch (Exception e) { } } } } }
}</source>
Stopping a Thread: set a boolean variable that the thread checks occasionally
<source lang="java">
public class Main {
public static void main(String[] argv) throws Exception { MyThread thread = new MyThread(); thread.start(); thread.stop = true; }
} class MyThread extends Thread {
boolean stop = false; public void run() { while (true) { if (stop) { return; } } }
}</source>
Use wait() and notify() from Object class
<source lang="java">
class MyResource {
boolean ready = false; synchronized void waitFor() throws Exception { System.out.println(Thread.currentThread().getName()+ " is entering waitFor()."); while (!ready) wait(); System.out.println(Thread.currentThread().getName() + " resuming execution."); } synchronized void start() { ready = true; notify(); }
} class MyThread implements Runnable {
MyResource myResource; MyThread(String name, MyResource so) { myResource = so; new Thread(this, name).start(); } public void run() { try { myResource.waitFor(); } catch (Exception e) { e.printStackTrace(); } }
} public class Main {
public static void main(String args[]) throws Exception { MyResource sObj = new MyResource(); new MyThread("MyThread", sObj); for (int i = 0; i < 10; i++) { Thread.sleep(50); System.out.print("."); } sObj.start(); }
}</source>