Java Tutorial/Thread/Wait Notify

Материал из Java эксперт
Перейти к: навигация, поиск

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>