让线程彼此等待。

时间:2014-08-06 03:51:36

标签: java multithreading

所以我目前有这个代码

class PrintDemo {
public void printCount(){
try {
     for(int i = 5; i > 0; i--) {
        System.out.println("Counter   ---   "  + i );
     }
 } catch (Exception e) {
     System.out.println("Thread  interrupted.");
   } 
 }

 }

class ThreadDemo extends Thread {
private Thread t;
private String threadName;
PrintDemo  PD;

ThreadDemo( String name,  PrintDemo pd){
    threadName = name;
     PD = pd;
}
public void run() {
  synchronized(PD) {
     PD.printCount();
  }
  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[]) {

  PrintDemo PD = new PrintDemo();

  ThreadDemo T1 = new ThreadDemo( "Thread - 1 ", PD );
  ThreadDemo T2 = new ThreadDemo( "Thread - 2 ", PD );

  T1.start();
  T2.start();

  // wait for threads to end
  try {
     T1.join();
     T2.join();
  } catch( Exception e) {
     System.out.println("Interrupted");
  }

它打印出以下输出:

Starting Thread - 1
Starting Thread - 2
Counter   ---   5
Counter   ---   4
Counter   ---   3
Counter   ---   2
Counter   ---   1
Thread Thread - 1  exiting.
Counter   ---   5
Counter   ---   4
Counter   ---   3
Counter   ---   2
Counter   ---   1
Thread Thread - 2  exiting.

有没有什么方法可以让线程1减1,然后逐个线程2,直到两者都为1,而不是让线程1减少到1,然后线程2减少到1。

1 个答案:

答案 0 :(得分:3)

由于您在两个线程中共享PrintDemo类的同一对象,因此可以用作锁(监视器)。

示例代码:

class PrintDemo {
    public void printCount() {
        try {
            for (int i = 5; i > 0; i--) {
                synchronized (this) {
                    this.notify();
                }
                System.out.println(Thread.currentThread().getName()+" Counter   ---   " + i);
                synchronized (this) {
                    this.wait();
                }
            }
        } catch (Exception e) {
            System.out.println("Thread  interrupted.");
        }
    }
}

class ThreadDemo extends Thread {
    private Thread t;
    private String threadName;
    PrintDemo PD;

    ThreadDemo(String name, PrintDemo pd) {
        threadName = name;
        PD = pd;
    }

    public void run() {
        synchronized (PD) {
            PD.printCount();
        }
        System.out.println("Thread " + threadName + " exiting.");

        synchronized (PD) {
            PD.notify(); // notify the last waited thread.
        }
    }

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

输出:

Starting Thread - 1 
Starting Thread - 2 
Thread - 1  Counter   ---   5
Thread - 2  Counter   ---   5
Thread - 1  Counter   ---   4
Thread - 2  Counter   ---   4
Thread - 1  Counter   ---   3
Thread - 2  Counter   ---   3
Thread - 1  Counter   ---   2
Thread - 2  Counter   ---   2
Thread - 1  Counter   ---   1
Thread - 2  Counter   ---   1
Thread Thread - 1  exiting.
Thread Thread - 2  exiting.

视觉表现:

enter image description here

Read more...