2017-06-26 81 views
0

我是Java多線程編程的新手。在這裏我想運行兩個線程 運行線程1 wait()notift()然後線程2 wait()notify()就像明智一樣。運行線程2線程等待並通知

有人可以幫助我實現這在下文中

代碼中給出的預期輸出

class RunnableDemo implements Runnable { 
    private Thread t; 
    private String threadName; 

    RunnableDemo(String name) { 
     threadName = name; 
     System.out.println("Creating " + threadName); 
    } 

    public void run() { 
     System.out.println("Running " + threadName); 
    synchronized (t){ 
     try { 
     for(int i = 1; i < = 5; i--) { 
      System.out.println("Thread: " + threadName + ", " + i); 
      wait(); 
      notify(); 
     } 
     }catch (InterruptedException e) { 
     System.out.println("Thread " + threadName + " interrupted."); 
     } 
    } 
     System.out.println("Thread " + threadName + " exiting."); 
    } 

    public void start() { 
     System.out.println("Starting " + threadName); 
     if (t == null) { 
     t = new Thread (this, threadName); 
     t.start(); 
     } 
    } 
} 

public class TestThread { 

    public static void main(String args[]) { 
     RunnableDemo R1 = new RunnableDemo("Thread-1"); 
     R1.start(); 

     RunnableDemo R2 = new RunnableDemo("Thread-2"); 
     R2.start(); 
    } 
} 

預計產量爲

Creating Thread-1 
Starting Thread-1 
Creating Thread-2 
Starting Thread-2 
Running Thread-1 
Thread: Thread-1, 1 
Running Thread-2 
Thread: Thread-2, 1 
............ 
Running Thread-1 
Thread: Thread-1, 5 
Running Thread-2 
Thread: Thread-2, 5 

,出現異常電流輸出爲

Creating Thread-1 
Starting Thread-1 
Creating Thread-2 
Starting Thread-2 
Running Thread-1 
Thread: Thread-1, 1 
Running Thread-2 
Thread: Thread-2, 1 
Exception in thread "Thread-1" Exception in thread "Thread-2" java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:502) 
    at RunnableDemo.run(TestThread.java:16) 
    at java.lang.Thread.run(Thread.java:745) 
java.lang.IllegalMonitorStateException 
    at java.lang.Object.wait(Native Method) 
    at java.lang.Object.wait(Object.java:502) 
    at RunnableDemo.run(TestThread.java:16) 
    at java.lang.Thread.run(Thread.java:745) 
+0

閱讀上的Java線程[這裏](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html) –

+0

@KevinAnderson所以反正是有達到我預期的結果 –

+0

可能是。一旦你已經學會了如何使用線程,它應該是可能的。 –

回答

0

您應該在同一個對象上使用wait()notify()進行通信。

class RunnableDemo implements Runnable { 
    private ThreadMonitor lock; 
    private String threadName; 
    private String otheThreadName; 

    RunnableDemo(String name, ThreadMonitor lock, String otheThreadName) { 
     this.threadName = name; 
     this.lock = lock; 
     this.otheThreadName = otheThreadName; 
     System.out.println("Creating " + threadName); 
    } 

    public void run() { 

     synchronized (lock) { 
      try { 

       for (int i = 1; i <= 5; i++) { 
        while (!lock.getRunningThread().equals(threadName)) { 
         lock.wait(); 
        } 
        System.out.println("Running " + threadName); 
        System.out.println("Thread: " + threadName + ", " + i); 
        lock.setRunningThread(otheThreadName); 
        lock.notify(); 
       } 
      } catch (InterruptedException e) { 
       System.out.println("Thread " + threadName + " interrupted."); 
      } 
     } 
     System.out.println("Thread " + threadName + " exiting."); 
    } 

    public void start() { 
     System.out.println("Starting " + threadName); 

     Thread t = new Thread(this, threadName); 
     t.start(); 
    } 

} 

public class TestThread { 

    public static void main(String args[]) { 
     ThreadMonitor lock = new ThreadMonitor("Thread-1"); 
     RunnableDemo R1 = new RunnableDemo("Thread-1", lock, "Thread-2"); 
     R1.start(); 

     RunnableDemo R2 = new RunnableDemo("Thread-2", lock, "Thread-1"); 
     R2.start(); 
    } 
} 

class ThreadMonitor { 
    private String runningThread; 

    public ThreadMonitor(String runningThread) { 
     this.runningThread = runningThread; 
    } 

    public String getRunningThread() { 
     return runningThread; 
    } 

    public void setRunningThread(String threadName) { 
     runningThread = threadName; 
    } 
} 
0

您正等待/通知錯誤。

爲了通知另一個線程,你必須調用另一個對象通知

你的代碼所做的是:一個線程將自己置於等待...以便稍後通知自己。

從這個意義上說:退一步看正確使用這兩種方法;例如,開始閱讀here