Java多线程实现生产者与消费者模型

这篇文章给大家分享的Java多线程实现生产者与消费者模型的代码,相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了以下内容,话不多说,一起往下看吧。

创新互联公司科技有限公司专业互联网基础服务商,为您提供双线服务器托管,高防服务器租用,成都IDC机房托管,成都主机托管等互联网服务。

首先有一个阻塞队列,生产者将生产的东西放到队列里,消费者再从队列中取。当队列中的东西数量达到其容量就发生阻塞。

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;

public class UseBlockingQueue {
    private static BlockingQueue queue = new ArrayBlockingQueue<>(1);//1是队列容量,超过就会阻塞。
            // new PriorityBlockingQueue<>();
            // new LinkedBlockingQueue<>();
            // new ArrayBlockingQueue<>(10);

    private static class Producer extends Thread {
        @Override
        public void run() {
            Random random = new Random(20191116);
            while (true) {
                try {
                    int message = random.nextInt(100);
                    queue.put(String.valueOf(message));//将消息放入队列中
                    System.out.println("放入消息: " + message);
                    Thread.sleep(random.nextInt(3) * 100);//睡眠
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    private static class Customer extends Thread {
        @Override
        public void run() {
            Random random = new Random(20191116);
            while (true) {
                try {
                    String message = queue.take();//从队列中取走消息
                    System.out.println("收到消息: " + message);
                    Thread.sleep(random.nextInt(3) * 100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        Thread producer = new Producer();
        Thread customer = new Customer();
        producer.start();
        customer.start();
    }
}

synchronized关键字修饰:给对象加锁,保证线程安全,如果CPU发生任意调度,也不会线程不安全。

public class MyQueue2 {
    private int[] array = new int[2];
    private volatile int size;
    private int front;
    private int rear;

    private Object full = new Object();
    private Object empty = new Object();

    public void put(int message) throws InterruptedException {
        while (size == array.length) {
            synchronized (full) {
                full.wait();
            }
        }

        synchronized (this) {
            array[rear] = message;
            rear = (rear + 1) % array.length;
            size++;
        }

        synchronized (empty) {
            empty.notify();
        }
    }

    public synchronized int take() throws InterruptedException {
        while (size == 0) {
            synchronized (empty) {
                empty.wait();
            }
        }

        int message;
        synchronized (this) {
            message = array[front];
            front = (front + 1) % array.length;
            size--;
        }

        synchronized (full) {
            full.notify();
        }

        return message;
    }
}

线程间的通信

public class ThreadDemo {
public static void main(String[] args){
class Person{
public String name;
private String gender;
public void set(String name,String gender){
this.name =name;
this.gender =gender;
}
public void get(){
System.out.println(this.name+"...."+this.gender);
}
}//Person类  有两个属性 两个方法
final Person p =new Person();//new一个Person类对象p
new Thread(new Runnable(){//匿名线程
public void run(){//覆写run方法
int x=0;
while(true){
if(x==0){
p.set("张三", "男");
}else{
p.set("lili", "nv");
}
x=(x+1)%2;
}
}
}).start();
new Thread(new Runnable(){
public void run(){
while(true){
p.get();
}
}
}).start();//启动一个匿名线程
}
}

看完这篇文章,你们学会Java多线程实现生产者与消费者模型的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读。


新闻标题:Java多线程实现生产者与消费者模型
新闻来源:http://csdahua.cn/article/jiddcg.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流