Java 简明教程
Java - Inter Thread Communication
如果你了解进程间通信,那么你将很容易理解线程间通信。
If you are aware of interprocess communication then it will be easy for you to understand interthread communication.
Inter-thread Communication in Java
在您开发两个或多个线程交换某些信息的应用程序时,线程间通信非常重要。线程间通信通过使用 Object class 的 wait()、 notify() 和 notifyAll() 方法来实现。
Inter-thread communication is important when you develop an application where two or more threads exchange some information. Inter-thread communication is achieved by using the wait(), notify(), and notifyAll() methods of the Object class.
Methods used for Inter-thread Communication
有三个简单的方法和一个使线程通信成为可能的小技巧。所有三个方法如下所列 −
There are three simple methods and a little trick which makes thread communication possible. All the three methods are listed below −
Sr.No. |
Method & Description |
1 |
public void wait() Causes the current thread to wait until another thread invokes the notify(). |
2 |
public void notify() Wakes up a single thread that is waiting on this object’s monitor. |
3 |
public void notifyAll() Wakes up all the threads that called wait( ) on the same object. |
这些方法已作为 final 中的对象方法实现,因此在所有类中均可用。所有三个方法只能在 synchronized 上下文中调用。
These methods have been implemented as final methods in Object, so they are available in all the classes. All three methods can be called only from within a synchronized context.
Example of Inter-thread Communication in Java
此示例显示了两个线程如何使用 wait() 和 notify() 方法进行通信。您可以使用相同概念创建复杂系统。
This examples shows how two threads can communicate using wait() and notify() method. You can create a complex system using the same concept.
class Chat {
boolean flag = false;
public synchronized void Question(String msg) {
if (flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
flag = true;
notify();
}
public synchronized void Answer(String msg) {
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(msg);
flag = false;
notify();
}
}
class T1 implements Runnable {
Chat m;
String[] s1 = { "Hi", "How are you ?", "I am also doing fine!" };
public T1(Chat m1) {
this.m = m1;
new Thread(this, "Question").start();
}
public void run() {
for (int i = 0; i < s1.length; i++) {
m.Question(s1[i]);
}
}
}
class T2 implements Runnable {
Chat m;
String[] s2 = { "Hi", "I am good, what about you?", "Great!" };
public T2(Chat m2) {
this.m = m2;
new Thread(this, "Answer").start();
}
public void run() {
for (int i = 0; i < s2.length; i++) {
m.Answer(s2[i]);
}
}
}
public class TestThread {
public static void main(String[] args) {
Chat m = new Chat();
new T1(m);
new T2(m);
}
}
当上面的程序被编译并执行时,它会产生以下结果 -
When the above program is complied and executed, it produces the following result −