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 {