关于线程的同步通信
线程的同步通信是一种避免死锁,让线程在进入阻塞状态时尽量释放其锁定的资源,以便为其他的线程提供运行的机会的有效解决措施。
所谓的的同步通信,就和线程的同步差不多,因为二者在操作的资源上都是那种临界资源,只不过线程的同步和线程的同步通信二者的执行动作(即 run()方法中存放的线程处理代码)不同。
要实现同步通信,就要用到Object类中定义的几个方法:wait()、notify()、notifyAll()。
wait():被锁定的对象可以调用wait()方法,这将导致当前线程被阻塞并释放该对象的互斥锁,即解除了wait()方法当前对象的锁定状态,其他的线程就有机会访问该对象。
notify():唤醒调用wait()方法后被阻塞的线程。每次运行该方法只能唤醒一个线程。
notifyAll():唤醒所有调用wait()方法被阻塞的线程。
线程同步通信的构架:
class Res{
}
class Input implements Runnable{
publicvoid run() {
synchronized (对象锁) {
try {
wait();//调用等待方法锁住线程
} catch(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();//调用此方法唤醒线程,解锁、释放资源
}
}
}
}
class Output implements Runnable{
publicvoid run() {
synchronized (线程所对象) {
try {
r.wait();//调用等待方法锁住线程
} catch(InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
notify();//调用此方法唤醒线程,解锁、释放资源
}
}
}
publicclass TestInfor {
publicstaticvoid main(String[] args) {
///开启线程
Res r =new Res();
Inputinput = new Input();
Output output = new Output();
Thread t1 = newThread(input);
Thread t2 = newThread(output);
t1.start();
t2.start();
}
}
这样就实现了线程的同步通信
再看一实例:
生产者-消费者问题是多线程同步处理的典型问题
原理:有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品。并且生产者和消费者生产出产品后才通知消费者消费,否则,消费者只能等待生产者生产出来后在消费。
我们来看一个例子的出现的几种不同状况,从而也加深一下我们对于同步通信构架来历的理解。
packagecsdn.java.thread;
class Res{
String name;
char易做图;
}
class Input implements Runnable{
Res r;
public Input(Res r){
this.r=r;
}
@Override
publicvoid run() {
int i =0;
while(true){
if(i==0){
r.name = "张三";
r.易做图 ='男';
}else {
r.name ="李四";
r.易做图 ='女';
}
r.flag =true;
i =(i+1)%2;
}
}
}
class Output implements Runnable{
Res r;
public Output(Res r){
this.r = r;
}
@Override
publicvoid run() {
while(true){
System.out.println(r.name +"..."+r.易做图);
r.flag =false;
}
}
}
publicclass TestInfor {
publicstaticvoid main(String[] args) {
Res r =new Res();
Inputinput = new Input(r);
Output output = new Output(r);
补充:综合编程 , 其他综合 ,