多线程小例子

来源:互联网 发布:c语言 char 编辑:程序博客网 时间:2024/06/06 02:45
/*注意代码里面的while(flag)判断是否需要进行操作, 如果是if会只进行判断一次,while则是每次线程唤醒之后还需要再进行一次判断。
synchronized不再使用,因为这样会使notify配套使用,而在这个类型之中需要两套监视器,分别控制着生产者和消费者。
在这种线程问题之中要注意死锁问题以及线程调用*/
import java.util.concurrent.locks.*;
import java.util.concurrent.locks.ReentrantLock;

class resource {
    private int t = 1;
    private boolean flag = false;
    private String name;
    Lock lock=new ReentrantLock();
    Condition a=lock.newCondition();
    Condition b=lock.newCondition();
    public  void set(String name)
    {
        lock.lock();
        try
      {
          while(flag)
          try{a.await();}catch(InterruptedException e) {}
          this.name=t+"个"+name;
          t++;
        System.out.println(Thread.currentThread().getName()+"生产了"+"第"+this.name);
        flag=true;
        b.signal();
      }
        finally
        {
            lock.unlock();
        }
    }
    public void out()
    {    lock.lock();
            try
            {
                while(!flag)
                    try {b.await();}catch(InterruptedException e) {}
                System.out.println(Thread.currentThread().getName()+"消费了第"+"..."+this.name);
                flag=false;
                a.signal();
            }
            finally
            {
                lock.unlock();
            }
            
        }
        
    }
    
    class creater implements Runnable
    {    private int i=1;
        private resource r;
        creater(resource r)
        {
            this.r=r;
        }
        public void run() {
            while(i<=100)
            {
                
                r.set("鸡");
                i++;
            
                
                
            }
        }
    }

class customer implements Runnable
{    private int i=1;
    private resource r;
    customer(resource r)
    {
        this.r=r;
    }
    public void run() {
           while(i<=100)
            {
              
            r.out();
             i++;
            
            
            
            }
        }
        
    }

public class MoreWorkDemo {
    public static void main(String[] args) {
        resource r = new resource();
        creater c=new creater(r);
        customer b=new customer(r);
        Thread t0 = new Thread(c);
        Thread t1= new Thread(c);
        Thread t2 = new Thread(b);
        Thread t3 = new Thread(b);
        t0.start();
        t1.start();
        t2.start();
        t3.start();
        
    }

}

原创粉丝点击