线程–多线程通讯实例## 标题
需要用到的Object类的相关方法:
wait() | 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。 |
---|---|
wait(long timeout) | 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或指定的时间已过。 |
wait(long timeout, int nanos) | 导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或者某些其他线程中断当前线程,或者已经过了一定量的实时时间。 |
void notifyAll() | 唤醒正在等待对象监视器的所有线程。 |
notify() | 唤醒正在等待对象监视器的单个线程。 |
错误实例:
public class Demo{
public static void main(String[] args) {
Destination d = new Destination();
new Passenger(d).start();
new Driver(d).start();
}
//乘客
static class Passenger extends Thread{
private Destination d;
public Passenger(Destination d){
this.d = d;
}
@Override
public void run() {
for(int i=1;i<=100;i++){
if(i%2==0) {
d.setNameAndTaste("菜场"+i, i+3);
}else{
d.setNameAndTaste("超市"+i,i);
}
}
}
}
//司机
static class Driver extends Thread{
private Destination d;
public Driver(Destination d){
this.d = d;
}
@Override //让司机载100个乘客
public void run() {
for(int i=1;i<=100;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
d.get();
}
}
}
//目的地和价格
static class Destination {
private String desName;
private double price;
public void setNameAndTaste(String desName,double price){
this.desName = desName;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.price = price;
}
public void get(){
System.out.println("目的地" + desName + "到了,价格为:" + price);
}
}
}
可以看到地点和价格明显没有对上
思路:顾客先选好地点,然后唤醒司机自己等待,让司机载去目的地,到达目的地后,司机唤醒下一个客人。
public class Demo{
public static void main(String[] args) {
Destination d = new Destination();
new Passenger(d).start();
new Driver(d).start();
}
//乘客
static class Passenger extends Thread{
private Destination d;
public Passenger(Destination d){
this.d = d;
}
@Override
public void run() {
for(int i=0;i<100;i++){
if(i%2==0) {
d.setNameAndTaste("菜场"+i, i+3);
}else{
d.setNameAndTaste("超市"+i,i);
}
}
}
}
//司机
static class Driver extends Thread{
private Destination d;
public Driver(Destination d){
this.d = d;
}
@Override //让司机载100个乘客
public void run() {
for(int i=0;i<100;i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
d.get();
}
}
}
//目的地和价格
static class Destination {
private String desName;
private double price;
private boolean flag = true;//true表示可以载下一个乘客
public void setNameAndTaste(String desName,double price){
if(flag) {
this.desName = desName;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.price = price;
flag = false;
this.notifyAll();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void get(){
if(!flag) {
System.out.println("目的地" + desName + "到了,价格为:" + price);
flag = true;
this.notifyAll();
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}