多线程主要考察的就是 线程的同步控制 生产者消费者的思路就是,当 一个线程执行时让另一个线程 挂起就行了
ThreadOne、ThreadTwo同时运行,添加一个变量在一个公共类(下边的Function类)中,
例如:当变量为true,ThreadOne执行ThreadTwo挂起;
当变量为false,ThreadOne挂起ThreadTwo执行
一个线程执行完之后,自己重置变量(目的是把自己挂起),然后唤醒另一个挂起的线程,如此便可使两个线程交替执行
对于消费者、生产者来说:
当消费者拿不到东西的时候就把自己挂起,并且唤醒生产者就可以了
当生产者生产完东西的时候就把自己挂起,并且唤醒消费者就可以了
//这是一个共享的类,主线程和子线程共用
class Function{
private boolean flag=false;
//子线程要实现的功能
public synchronized void sub(){
while(flag){ //此处用while循环而不是用if语句判断是为了防止 线程的假唤醒
try {
this.wait(); //此处的this指的是当前执行此段代码的线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<10;i++){
//for循环内定义子线程的功能,这里简单的假设为打印一句话,主线程同理
System.out.println("sub"+i);
}
flag=true;
this.notify();
}
//主线程要实现的功能
public synchronized void main(){
while(!flag){ //此处用while循环是为了 防止线程的假唤醒
try {
this.wait(); //此处this指的是当前执行此段代码的线程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(int i=0;i<10;i++){
System.out.println("main"+i);
}
flag=false;
this.notify();
}
}
public class Demo01 {
public static void main(String[] args) {
final Function f=new Function();
new Thread(
new Runnable(){
@Override
public void run() {
for(int i=0;i<50;i++){
f.sub();
}
}
}
).start();
for(int i=0;i<50;i++){
f.main();
}
}
}