Java线程之间的变量共享数据传输实现通知
时间: 2023-08-05 15:18:40 浏览: 46
Java线程之间的变量共享数据传输可以使用wait()和notify()方法实现通知。具体来说,可以使用一个共享对象作为锁,然后在一个线程中调用该共享对象的wait()方法,使该线程等待;在另一个线程中调用该共享对象的notify()方法,通知等待的线程可以继续执行。
下面是一个简单的示例代码:
```
public class SharedData {
private int data;
private boolean flag = false; // 标记变量,表示数据是否可用
public synchronized int getData() {
while(!flag) { // 数据不可用时等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false; // 取走数据后将标记变量置为false
notify(); // 通知生产者可以生产数据
return data;
}
public synchronized void setData(int data) {
while(flag) { // 数据已经可用时等待
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.data = data;
flag = true; // 生产数据后将标记变量置为true
notify(); // 通知消费者可以取走数据
}
}
public class Producer implements Runnable {
private SharedData data;
public Producer(SharedData data) {
this.data = data;
}
@Override
public void run() {
for(int i=0; i<10; i++) {
data.setData(i);
System.out.println("生产数据:" + i);
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Consumer implements Runnable {
private SharedData data;
public Consumer(SharedData data) {
this.data = data;
}
@Override
public void run() {
for(int i=0; i<10; i++) {
int num = data.getData();
System.out.println("消费数据:" + num);
try {
Thread.sleep((int)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
SharedData data = new SharedData();
Producer producer = new Producer(data);
Consumer consumer = new Consumer(data);
new Thread(producer).start();
new Thread(consumer).start();
}
}
```
在上面的示例代码中,共享对象是SharedData类,其中的flag变量表示数据是否可用。当flag为false时,消费者线程调用getData()方法时会进入等待状态,直到生产者线程调用setData()方法生产数据并将flag变量置为true。当flag为true时,生产者线程调用setData()方法时会进入等待状态,直到消费者线程调用getData()方法取走数据并将flag变量置为false。同时,每次生产或消费数据后,都会打印一条消息用于验证数据的正确性。