日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java线程同步的实现_【Java多线程系列三】实现线程同步的方法

發布時間:2025/3/8 java 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java线程同步的实现_【Java多线程系列三】实现线程同步的方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

packagecom.concurrent.test;importjava.util.Stack;importjava.util.concurrent.ArrayBlockingQueue;importjava.util.concurrent.BlockingQueue;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.ReentrantLock;/*** @Description: 三種方法實現生產者/消費者*/

public classThreadSynchronizeTest {public static voidmain(String[] args) {

ProducerConsumer producerConsumer= newProducerConsumerViaBlockingQueue();

producerConsumer.test();

}

}abstract classProducerConsumer {protected int capacity = 10;protected int element = 0;protected abstract void produce() throwsInterruptedException;protected abstract void consume() throwsInterruptedException;public voidtest() {

Thread producer= new Thread(newRunnable() {

@Overridepublic voidrun() {while (true) {try{

produce();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

});

Thread consumer= new Thread(newRunnable() {

@Overridepublic voidrun() {while (true) {try{

consume();

}catch(InterruptedException e) {

e.printStackTrace();

}

}

}

});

producer.start();

consumer.start();

}

}/*** 方法一:ReentrantLock結合Condition*/

class ProducerConsumerViaReentrantLock extendsProducerConsumer {private Stack stack = new Stack<>();private ReentrantLock lock = newReentrantLock();private Condition notFull =lock.newCondition();private Condition notEmpty =lock.newCondition();

@Overrideprotected void produce() throwsInterruptedException {try{

lock.lock();if (stack.size() ==capacity) {

notFull.await();

}++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

stack.push(element);

notEmpty.signalAll();

Thread.sleep(1000L);

}finally{

lock.unlock();

}

}

@Overrideprotected void consume() throwsInterruptedException {try{

lock.lock();if(stack.isEmpty()) {

notEmpty.await();

}int element =stack.pop();

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " consume " +element);

notFull.signalAll();

}finally{

lock.unlock();

}

}

}/*** 方法二:synchronized 結合 wait、notify、notifyAll*/

class ProducerConsumerViaObjectLock extendsProducerConsumer {private Stack stack = new Stack<>();private Object lock = newObject();

@Overrideprotected void produce() throwsInterruptedException {/** 1,lock為監視器

* 2,wait/notify/notifyAll方法必須在synchronized塊內調用

* 3,調用wait/notify/notifyAll方法但不持有監視器的使用權將會拋出java.lang.IllegalMonitorStateException*/

synchronized(lock) {if (stack.size() ==capacity) {

lock.wait();

}++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

stack.push(element);

lock.notifyAll();

Thread.sleep(1000L);

}

}

@Overrideprotected void consume() throwsInterruptedException {synchronized(lock) {if(stack.isEmpty()) {

lock.wait();

}int element =stack.pop();

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " consume " +element);

lock.notifyAll();

}

}

}/*** 方法三:BlockingQueue*/

class ProducerConsumerViaBlockingQueue extendsProducerConsumer {private BlockingQueue queue = new ArrayBlockingQueue<>(capacity);

@Overrideprotected void produce() throwsInterruptedException {++element;

System.out.println(Thread.currentThread().getId()+ "," + Thread.currentThread().getName() + " produce " +element);

queue.put(element);

Thread.sleep(1000L);

}

@Overrideprotected void consume() throwsInterruptedException {int element =queue.take();

System.out.println(Thread.currentThread().getId()+ " consume " +element);

Thread.sleep(10000L);

}

}

總結

以上是生活随笔為你收集整理的java线程同步的实现_【Java多线程系列三】实现线程同步的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。