通信:一个发送数据(将获取的数据存入数组再发送出去),一个获取数据(创建数组来接收,数组和发送方一样大);这时当发送数据方数组存满,又重新存入数据,第一次的数据就会被覆盖,而获取数据方还没有来的急将第一次存的数据取出来,就会造成数据丢失。
这时有一种解决方法就是,每次数组满了,就等待,直到对方获取完数据,再加载,这样避免数据覆盖造成的丢失;获取方也是,每次空时就等待,直到有数据,这样避免造成去重复的数据。
从上面分析,这样必须用到同步和它的方法 :wait()、notify()、notifyAll()
用法
public class NumRunble implements Runnable {
int count = 0;
int inpos = 0;
int outpos = 0;
int[] cells = new int[5];
public void run() {
while (true) {
get();
}
}
public synchronized void put(int num) {
try {
while (count == cells.length) {
System.out.println("输入线程等待中");
this.wait();
}
cells[inpos] = num;
System.out.println("在cells[" + inpos + "]中放入数据---" + cells[inpos]);
inpos++;
if (inpos == cells.length) {
inpos = 0;
}
count++;
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void get() {
try {
while (count == 0) {
System.out.println("获取线程等待中");
this.wait();
}
int data = cells[outpos];
System.out.println("在cells[" + outpos + "]中取出数据---" + data);
cells[outpos] = 0;
outpos++;
if (outpos == cells.length) {
outpos = 0;
}
count--;
this.notify();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
NumRunble numRunble = new NumRunble();
Thread thread1 = new Thread(numRunble);
thread1.start();
//输入
// numRunble.put(1);
for (int i = 0 ; i<10;i++){
numRunble.put(i);
}
打印结果:
“C:\Program Files\Java\jdk1.8.0_261\bin\java.exe” “-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\lib\idea_rt.jar=52675:C:\Program Files\JetBrains\IntelliJ IDEA 2021.1\bin” -Dfile.encoding=UTF-8 -classpath “C:\Program Files\Java\jdk1.8.0_261\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_261\jre\lib\rt.jar;E:\server\JiaYou\target\classes” Hello
在cells[0]中放入数据—0
在cells[1]中放入数据—1
在cells[2]中放入数据—2
在cells[3]中放入数据—3
在cells[4]中放入数据—4
输入线程等待中
在cells[0]中取出数据—0
在cells[1]中取出数据—1
在cells[2]中取出数据—2
在cells[3]中取出数据—3
在cells[4]中取出数据—4
获取线程等待中
在cells[0]中放入数据—5
在cells[1]中放入数据—6
在cells[2]中放入数据—7
在cells[3]中放入数据—8
在cells[4]中放入数据—9
在cells[0]中取出数据—5
在cells[1]中取出数据—6
在cells[2]中取出数据—7
在cells[3]中取出数据—8
在cells[4]中取出数据—9
获取线程等待中
wait() : 线程进入等待,不往下执行
notify(): 释放等待状态,线程往下执行