1. 程式人生 > >java中模擬一個阻塞佇列(多執行緒)

java中模擬一個阻塞佇列(多執行緒)

模擬一個阻塞佇列,當這個佇列中滿了的話,再往裡新增元素則會阻塞在那裡,直到有元素取出的時候才能往裡加,取元素的時候,當佇列是空的時候則會阻塞在那裡,一直到有元素新增為止

import java.util.LinkedList;
import java.util.concurrent.atomic.AtomicInteger;
/**
 * 模擬Queue
 * @author 小鵬鵬
 *
 */
public class MyQueue {

    private final LinkedList<Object> list = new LinkedList<Object>();

    private
final AtomicInteger count = new AtomicInteger(0); private final int maxSize; private final int minSize = 0; private final Object lock = new Object(); public MyQueue (int maxSize){ this.maxSize = maxSize; } public void put (Object obj) { synchronized(lock){ while
(count.get() == maxSize){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(obj); count.getAndIncrement(); System.out.println(" 元素 "
+ obj + " 被新增 "); lock.notify(); } } public Object take(){ Object temp = null; synchronized (lock) { while(count.get() == minSize){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } count.getAndDecrement(); temp = list.removeFirst(); System.out.println(" 元素 " + temp + " 被消費 "); lock.notify(); } return temp; } public int size(){ return count.get(); } public static void main(String[] args) throws Exception { final MyQueue m = new MyQueue(5); m.put("a"); m.put("b"); m.put("c"); m.put("d"); m.put("e"); System.out.println("當前元素個數:" + m.size()); Thread t1 = new Thread(new Runnable() { @Override public void run() { m.put("h"); m.put("i"); } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(1000); Object t1 = m.take(); //System.out.println("被取走的元素為:" + t1); Thread.sleep(1000); Object t2 = m.take(); //System.out.println("被取走的元素為:" + t2); } catch (InterruptedException e) { e.printStackTrace(); } } }, "t2"); t1.start(); Thread.sleep(1000); t2.start(); } }

相關推薦

java模擬一個阻塞佇列執行

模擬一個阻塞佇列,當這個佇列中滿了的話,再往裡新增元素則會阻塞在那裡,直到有元素取出的時候才能往裡加,取元素的時候,當佇列是空的時候則會阻塞在那裡,一直到有元素新增為止 import java.util.LinkedList; import java.util

Java 使用阻塞佇列 BlockingQueue 執行搜尋目錄及子目錄下包含關鍵字所有檔案

Java 使用阻塞佇列 BlockingQueue 多執行緒在一個目錄及它的所以子目錄下搜尋所有檔案,打印出包含關鍵字的行 阻塞佇列( blocking queue ) 生產者執行緒向佇列插人元素, 消費者執行緒則取出它們。使用佇列,可以安全地從一個執行緒向另一個執行緒傳遞資料。

Java之UDP傳輸聊天程式小Demo執行

ChatDemo.java import java.net.DatagramSocket; public class ChatDemo { public static void main(String[] args) { try {

socket ( java ) 簡單個客戶端、服務端通訊執行

實現: 客戶端:多個socket(多個埠),其中一個客戶端的一個埠用於接收服務端傳送過來的訊息,其一個用於向服務端傳送訊息。其它客戶端只有發訊息的功能。 服務端:兩個socket,一個用於迴圈接收客戶端傳送過來的socket請求。一個用於接收訊息手自動向客戶端

Java大資料量執行分段分批處理

分段處理主類 package pers.zuo.component.piecewise; import java.util.ArrayList; import java.util.List; import java.util.concurrent.C

Java Socket程式設計 標準範例執行

伺服器端(Server)非多執行緒 package com.zeph.serverclient; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamR

Linux程序執行程式設計

多程序程式設計 一、複製程序映像的fork系統呼叫 1) 父程序返回子程序的PID,子程序返回0 2)寫時拷貝 子程序與父程序程式碼完全一致,同時它還會複製父程序的資料(堆資料,棧資料及靜態資料),採用寫時拷貝技術,只有在任一程序對資料進行了讀寫操作時,拷貝才會發生。

java架構之路執行JMM和volatile關鍵字

  貌似兩個多月沒寫部落格,不知道年前這段時間都去忙了什麼。   好久以前寫過一次和volatile相關的部落格,感覺沒寫的那麼深入吧,這次我們繼續說我們的volatile關鍵字。 複習:   先來簡單的複習一遍以前寫過的東西,上次我們說了記憶體一致性協議M(修改)E(獨佔)S(共享)I(失效)四種狀態,還有

java架構之路執行大廠方式手寫單例模式

上期回顧:   上次部落格我們說了我們的volatile關鍵字,我們知道volatile可以保證我們變數被修改馬上刷回主存,並且可以有效的防止指令重排序,思想就是加了我們的記憶體屏障,再後面的多執行緒部落格裡還有說到很多的屏障問題。    volatile雖然好用,但是別用的太多,咱們就這樣想啊,

java架構之路執行synchronized詳解以及鎖的膨脹升級過程

  上幾次部落格,我們把volatile基本都說完了,剩下的還有我們的synchronized,還有我們的AQS,這次部落格我來說一下synchronized的使用和原理。   synchronized是jvm內部的一把隱式鎖,一切的加鎖和解鎖過程是由jvm虛擬機器來控制的,不需要我們認為的干預,我們大致從瞭

java架構之路執行AQS之ReetrantLock顯示鎖的使用和底層原始碼解讀

  說完了我們的synchronized,這次我們來說說我們的顯示鎖ReetrantLock。 上期回顧:   上次部落格我們主要說了鎖的分類,synchronized的使用,和synchronized隱式鎖的膨脹升級過程,從無鎖是如何一步步升級到我們的重量級鎖的,還有我們的逃逸分析。 鎖的粗化和鎖的消除  

java架構之路執行JUC併發程式設計之Semaphore訊號量、CountDownLatch、CyclicBarrier柵欄、Executors執行

上期回顧:   上次部落格我們主要說了我們juc併發包下面的ReetrantLock的一些簡單使用和底層的原理,是如何實現公平鎖、非公平鎖的。內部的雙向連結串列到底是什麼意思,prev和next到底是什麼,為什麼要引入heap和tail來值向null的Node節點。高併發時候是如何保證state來記錄重入鎖的

java架構之路執行原子操作,Atomic與Unsafe魔術類

  這次不講原理了,主要是一些應用方面的知識,和上幾次的JUC併發程式設計的知識點更容易理解. 知識回顧:   上次主要說了Semaphore訊號量的使用,就是一個票據的使用,我們舉例了看3D電影拿3D眼鏡的例子,還說了內部的搶3D眼鏡,和後續排隊的原始碼解析,還有CountDownLatch的使用,我們是用

iOS - 知識梳理執行

多執行緒:一個程序裡面開啟多條執行緒,每條執行緒可以單獨的執行不同的任務。 iOS實現多執行緒的方式: 1、pthread(C寫的、基本不用) 2、NSThread 3、gcd 4、NSOperation 下面分別介紹下後三個常用的多執行緒方式 NSThread: 使用方式

購物表動態連結串列+鬧鐘提醒執行

基本連結串列的應用 增 刪 查 找 排 模糊查詢 核心程式碼如下: #include <stdio.h> #include <math.h> #include <string.h> #include <malloc.h> #incl

實現客戶端寫入字串,在服務端翻轉後返回執行

實現客戶端寫入字串,在服務端翻轉後返回 服務端: package network.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import

Qt:Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊執行

Qt實現Winsock網路程式設計—TCP服務端和客戶端通訊(多執行緒) 前言 感覺Winsock網路程式設計的api其實和Linux下網路程式設計的api非常像,其實和其他程式語言的網路程式設計都差不太多。博主用Qt實現的,當然不想用黑視窗唄,有介面可以看到,由於GUI程式設計

知識梳理執行

多執行緒:一個程序裡面開啟多條執行緒,每條執行緒可以單獨的執行不同的任務。 iOS實現多執行緒的方式: 1、pthread(C寫的、基本不用) 2、NSThread 3、gcd 4、NSOperation 下面分別介紹下後三個常用的多執行緒方式 NSThread:

Java之TCP傳輸小Demo執行:服務端

import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; public c

Java之TCP傳輸小Demo執行:客戶端

import java.io.*; import java.net.Socket; public class TCPClientDemo { public static void main(String[] args) throws IOException {