多线程

对于多线程这一块,今日我就用这个代码给大家做演示,可以先敲出来,对着相应的书籍进行参考。

最近忙于备考·,所有有很多细节问题就没机会给大家好好解释。请见谅。下面给大家加一张效果图。

package G1.Thread;

 

public class ProducerCustomerTest{

 

 

public static void main(String[] args) {
// TODO Auto-generated method stub
LinkTest11 l = new LinkTest11();//实例化了一个计数器对象,在堆区为它分配了一块儿空间。
Thread t1 = new Thread(new Producer(l));
Thread t2 = new Thread(new Customer(l));
t1.start();
t2.start();
}

}

//可以理解为一个计数器类,记录生产和消费得是第几个馒头,并且包含生产和包装两个方法
class LinkTest11{
//记录第几个馒头
int num;
//是否有馒头,false是没有馒头
boolean flag = false;

//生产得方法
public synchronized void setNum(int num){
if(flag){
System.out.println("A生产者说有馒头了,我得睡一会儿调用了wait()方法打开锁");
try {
this.wait();//线程wait以后,锁不归该线程所有。
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.num = num;
System.out.print("A生产者生产了第"+num+"个馒头");
flag = true;
System.out.println("A说赶紧起来吃馒头了,叫醒B消费者");
this.notify();
}

//消费得方法
public synchronized void getNum(){
if(!flag){
System.out.println("B消费者说吃的太快没有馒头了,我得睡一会儿调用了wait()方法打开锁");
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.print("B消费者吃了第"+num+"个馒头");
flag = false;
System.out.println("B说馒头吃完了,叫醒A生产者做馒头了");
this.notify();
}
}

class Producer implements Runnable{

//因为生产者和消费者用得是同一个计数器,所以不能new,所有只能传一个计数器进来
LinkTest11 l ;
Producer(LinkTest11 l){
this.l = l;
}

@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=10;i++){
l.setNum(i);
}
System.out.println("A生产者下班了");
}

}


class Customer implements Runnable{

//因为生产者和消费者用得是同一个计数器,所以不能new,所有只能传一个计数器进来
LinkTest11 l ;
Customer(LinkTest11 l){
this.l = l;
}

@Override
public void run() {
// TODO Auto-generated method stub
for(int i=1;i<=10;i++){
l.getNum();
}
System.out.println("B生产者下班了");
}

}

原文地址:https://www.cnblogs.com/tianyating/p/9162403.html