/*
线程间的通信
多个线程在处理同一个资源,但是任务却不相同
*/
class Resource {
private String name;
private String sex;
private boolean flag = false;
public synchronized void set(String name, String sex) {
if (flag) try {
this.wait();
} catch (InterruptedException e) {}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}
public synchronized void out() {
if (!flag) try {
this.wait();
} catch (InterruptedException e) {}
System.out.println(name + "````````" + sex);
flag = false;
this.notify();
}
}
class Input implements Runnable {
Object obj = new Object();
Resource r;
Input(Resource r) {
this.r = r;
}
public void run() {
int x = 0;
while (true) {
if (x == 0) {
r.set("mike", "nan");
} else {
r.set("丽丽", "女女女女");
}
x = (x + 1) % 2;
}
}
}
class Output implements Runnable {
Resource r;
Output(Resource r) {
this.r = r;
}
public void run() {
while (true) {
r.out();
}
}
}
class ResourceDemo {
public static void main(String[] args) {
Resource r = new Resource();
Input in = new Input(r);
Output out = new Output(r);
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
t1.start();
t2.start();
}
}
这段代码是一个简单的Java程序,它演示了线程间的通信。程序中定义了一个名为Resource
的类,它包含了一些私有成员变量和一个同步方法set
以及一个同步方法out
。set
方法用于设置资源的名称和性别,而out
方法用于输出资源的信息。
Input
类实现了Runnable
接口,它代表一个输入线程,负责设置资源的值。Output
类也实现了Runnable
接口,它代表一个输出线程,负责打印资源的信息。
在ResourceDemo
类的main
方法中,创建了Resource
对象和两个线程对象t1
和t2
。t1
线程用于执行Input
类的run
方法,而t2
线程用于执行Output
类的run
方法。这两个线程分别代表不同的任务,它们通过Resource
对象进行通信。
程序的关键点在于wait
和notify
方法的使用。当set
方法被调用时,如果flag
为true
,表示资源已经被占用,那么调用wait
方法会使当前线程等待,直到其他线程调用notify
方法。当out
方法被调用时,如果flag
为false
,表示资源未被占用,那么调用wait
方法也会使当前线程等待,直到其他线程调用notify
方法。
flag
变量用于标记资源是否被占用。当资源被设置后,flag
被设置为true
,并且调用notify
方法唤醒等待的线程。当资源被输出后,flag
被设置为false
,并且调用notify
方法唤醒等待的线程。
这个程序的目的是演示线程同步和通信的基本机制,但它在实际应用中可能存在一些问题,比如死锁和资源竞争。在实际开发中,需要根据具体情况设计更健壮的线程同步机制。