java线程间的通信

-----------------------------------java线程间的通信------------------------------------

 

 

生产者和消费者

 


生产者生产水果,如果水果没有被买走就不生产处于等待状态,如果水果被消费者买走的时候,消费者就会通知生产者告诉他我们已经把水果买走了请生产。

 

消费者同理,如果如果水果已经生产出来那么就买走,买走之后再通知生产者水果已经没有了请生产。

 

注意:

1.线程间的通信共享数据一定要有同步代码块synchronized

       2.一定要有wait和notify,二者一定是成对出现的。

       3.生产者和消费者的线程实现一定是在while(true)死循环里面

 

 

实例:

 

水果类

 

public class Fruit {

 

    private String name;

   

    private  boolean  isExist;

 

    public String getName() {

        return  name;

    }

 

    public  void setName(String name) {

        this.name = name;

    }

 

    public boolean isExist() {

        return  isExist;

    }

 

    publicvoid setExist(booleanisExist) {

        this.isExist = isExist;

    }

}

 

 

生产者类

 

public  class ProductFruit implements Runnable {

 

    private Fruit fruit;

   

    public ProductFruit(Fruit fruit) {

        super();

        this.fruit = fruit;

    }

 

    @Override

    public  void run() {

       

        while(true) {

           //有共享的数据,多个线程操作共享的数据,必须使用锁

           synchronized (fruit) {

               //如果水果已经存在那么生产者就不生产,等待着消费者买走水果再生产

               if(fruit.isExist()) {

                   try {

                       //当前生产的水果被挂起变成阻塞状态

                       fruit.wait();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

               }

               try {

                   Thread.sleep(100);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

               System.out.println(fruit.getName() + "水果被生产出来");

               //把水果的状态变成存在

               fruit.setExist(true);

               //唤醒等待买水果的线程

               fruit.notify();

              

           }

        }

    }

}

 

购买者类

public  class BuyFruit implements Runnable{

 

    private Fruit fruit;

   

    public BuyFruit(Fruit fruit) {

        super();

        this.fruit = fruit;

    }

 

    @Override

    public  void run() {

       

        while(true) {

           //有共享的数据,多个线程操作共享的数据,必须使用锁

           synchronized (fruit) {

               if(!fruit.isExist()) {

                   try {

                       fruit.wait();

                   } catch (InterruptedException e) {

                       e.printStackTrace();

                   }

               }

               try {

                   Thread.sleep(100);

               } catch (InterruptedException e) {

                   e.printStackTrace();

               }

               System.out.println(fruit.getName() + "水果被买走");

               //把水果状态设为false

               fruit.setExist(false);

               //唤醒生产者生产水果

               fruit.notify();

           }

        }  

    }   

}

 

客服端类

 

public   class Client {

 

    public  static  void main(String[] args) {

       

        //创建水果对象

        Fruit f = new Fruit();

        f.setName("苹果");

        f.setExist(false);

       

        //创建生产者

        ProductFruit pf = new ProductFruit(f);

        //创建消费者

        BuyFruit bf = new BuyFruit(f);

       

        //创建线程

        Thread t1 = new Thread(pf);

        Thread t2 = new Thread(bf);

       

        //启动线程

        t1.start();

        t2.start();

       

/*      苹果水果被生产出来

        苹果水果被买走

        苹果水果被生产出来

        苹果水果被买走

        苹果水果被生产出来

        苹果水果被买走

        苹果水果被生产出来*/

    }

}

 

Java 中的线程间通信(Thread Communication)是为了让多个线程之间能够协作、同步和共享数据。这是实现并发编程的关键,有助于提高程序的效率和响应性。Java 提供了几种机制来支持线程间通信: 1. **wait() 和 notify() 方法**:这两个方法定义在 `Object` 类中,用于线程间的等待-唤醒模式。一个线程调用 `wait()` 方法会释放对象锁并进入等待状态,而持有锁的其他线程可以通过 `notify()` 或 `notifyAll()` 来唤醒等待的线程。 2. **synchronized 关键字**:用于同步代码块或方法,保证在同一时间只有一个线程可以访问特定代码段。这对于共享资源的互斥访问至关重要。 3. **BlockingQueue**:Java集合框架中的非阻塞队列,如 `LinkedList`、`ArrayBlockingQueue` 等,允许线程之间通过队列传递消息或数据。 4. **CountDownLatch** 和 **CyclicBarrier**:前者是一个计数器,当所有等待的线程完成某个任务后才会继续;后者是一个屏障,线程们会在到达屏障点时一起停下来,然后继续执行。 5. **Semaphore**:信号量可以控制同时访问某个资源的线程数量,类似于一个票证系统。 6. **Future 和 Callable**:`Future` 接口用于异步执行任务的结果,`Callable` 提供了一个可以返回结果的线程,结合 `ExecutorService` 可以实现线程间的异步通信。 7. **EventListeners** 和 `java.util.Observer`:适用于事件驱动编程模式,当事件发生时通知感兴趣的监听者。 8. **Java Message Service (JMS)**:企业级的消息传递API,用于生产者和消费者之间的异步通信。 每个场景选择合适的通信机制能更好地管理并发和避免死锁等问题。如果你需要进一步了解这些内容,或者有具体使用场景的问题,可以提出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值