用Java实现一个数据单元,包括学号,姓名两部分。编写两个线程,一个线程往数据单元中写,另一个线程往出读。要求每写一次就往出读一次
时间: 2024-03-01 17:55:19 浏览: 112
下面是一个简单的示例程序,该程序实现了一个数据单元类,包括学号和姓名两部分,并包含一个写入方法和一个读取方法。在主方法中创建了一个共享的数据单元对象和两个线程对象,一个用于写入数据,一个用于读取数据。每次写入数据时,都会通知读取线程进行读取,每次读取数据后,都会通知写入线程进行写入。
```java
public class DataUnit {
private String studentId;
private String name;
private boolean available = false;
public synchronized void write(String studentId, String name) {
while (available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.studentId = studentId;
this.name = name;
available = true;
notifyAll();
}
public synchronized String[] read() {
while (!available) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
String[] data = new String[]{studentId, name};
available = false;
notifyAll();
return data;
}
}
class Writer implements Runnable {
private DataUnit dataUnit;
public Writer(DataUnit dataUnit) {
this.dataUnit = dataUnit;
}
@Override
public void run() {
String[] students = new String[]{"1001", "1002", "1003", "1004", "1005"};
String[] names = new String[]{"Tom", "Jerry", "Mike", "Lucy", "Lily"};
for (int i = 0; i < students.length; i++) {
dataUnit.write(students[i], names[i]);
System.out.println("写入数据:" + students[i] + " " + names[i]);
String[] data = dataUnit.read();
System.out.println("读取数据:" + data[0] + " " + data[1]);
}
}
}
class Reader implements Runnable {
private DataUnit dataUnit;
public Reader(DataUnit dataUnit) {
this.dataUnit = dataUnit;
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
String[] data = dataUnit.read();
System.out.println("读取数据:" + data[0] + " " + data[1]);
dataUnit.write(data[0], data[1]);
System.out.println("写入数据:" + data[0] + " " + data[1]);
}
}
}
public class Test {
public static void main(String[] args) {
DataUnit dataUnit = new DataUnit();
Thread writerThread = new Thread(new Writer(dataUnit));
Thread readerThread = new Thread(new Reader(dataUnit));
writerThread.start();
readerThread.start();
}
}
```
在上面的代码中,使用了synchronized关键字来实现线程的同步,使得每次写入数据后都会通知读取线程进行读取,每次读取数据后都会通知写入线程进行写入。注意在写入方法和读取方法中都使用了while循环进行判断,而不是if语句。这是因为在多线程环境下,可能会出现虚假唤醒的情况,如果使用if语句进行判断,可能会导致程序出现问题。
阅读全文
相关推荐


















