非常经典的多线程处理模型
//生产者与消费者实例
class Info {
private String title ;
private String content ;
private boolean flag = true ;
// flag = true,表示可以生产,但是不可以取走
// flag = flase,表示可以取走,但是不可以生产
public synchronized void set(String title,String content) {
// 重复进入到set()方法里面,发现不能够生产,所以要等待
if(this.flag == false) {
try{
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.title = title ;
try { //休眠
Thread.sleep(100);
}catch (InterruptedException e ) {
e.printStackTrace();
}
this.content = content ;
this.flag = false ; //修改生产标记
super.notify(); // 唤醒其他等待线程
}
public synchronized void get() {
if(this.flag == true) {
try{
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try{
Thread.sleep(100);
} catch (InterruptedException e ) {
e.printStackTrace();
}
System.out.println(this.title + " - " + this.content);
this.flag = true ;
super.notify();
}
}
class Productor implements Runnable {
private Info info ;
public Productor (Info info){
this.info = info ;
}
public void run() {
for(int x=0 ; x < 10 ; x++ ){
if(x % 2 == 0) {
this.info.set("liu","nice");
}else {
this.info.set("qin","good");
}
}
}
}
class Customer implements Runnable {
private Info info ;
public Customer (Info info) {
this.info = info ;
}
public void run() {
for(int x=0 ; x<10 ; x++){
this.info.get();
}
}
}
public class Nice {
public static void main(String args[]){
Info info = new Info();
new Thread(new Productor(info)).start() ;
new Thread(new Customer(info)).start() ;
}
}
! sleep()与wait()的区别?
1.sleep()是Thread类定义的方法,wait()是Object()类定义的方法;
2.sleep()可以设置休眠时间,时间一到自动唤醒,而wait()需要等待notify()进行唤醒;