這篇文章給大家分享的Java多線程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型的代碼,相信大部分人都還沒(méi)學(xué)會(huì)這個(gè)技能,為了讓大家學(xué)會(huì),給大家總結(jié)了以下內(nèi)容,話不多說(shuō),一起往下看吧。
創(chuàng)新互聯(lián)公司科技有限公司專業(yè)互聯(lián)網(wǎng)基礎(chǔ)服務(wù)商,為您提供雙線服務(wù)器托管,高防服務(wù)器租用,成都IDC機(jī)房托管,成都主機(jī)托管等互聯(lián)網(wǎng)服務(wù)。
首先有一個(gè)阻塞隊(duì)列,生產(chǎn)者將生產(chǎn)的東西放到隊(duì)列里,消費(fèi)者再?gòu)年?duì)列中取。當(dāng)隊(duì)列中的東西數(shù)量達(dá)到其容量就發(fā)生阻塞。
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<String> queue = new ArrayBlockingQueue<>(1);//1是隊(duì)列容量,超過(guò)就會(huì)阻塞。
// 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));//將消息放入隊(duì)列中
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();//從隊(duì)列中取走消息
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關(guān)鍵字修飾:給對(duì)象加鎖,保證線程安全,如果CPU發(fā)生任意調(diào)度,也不會(huì)線程不安全。
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類 有兩個(gè)屬性 兩個(gè)方法
final Person p =new Person();//new一個(gè)Person類對(duì)象p
new Thread(new Runnable(){//匿名線程
public void run(){//覆寫(xiě)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();//啟動(dòng)一個(gè)匿名線程
}
}
看完這篇文章,你們學(xué)會(huì)Java多線程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。
當(dāng)前題目:Java多線程實(shí)現(xiàn)生產(chǎn)者與消費(fèi)者模型
URL標(biāo)題:http://muchs.cn/article26/jiddcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、ChatGPT、品牌網(wǎng)站設(shè)計(jì)、移動(dòng)網(wǎng)站建設(shè)、定制開(kāi)發(fā)、面包屑導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)