摘要
本博文主要是介绍多线程中的实战问题。通过实际的代码和例子提供大家更多练习和学习以及参考。
模拟多消费者和多生产者的的产生和消费问题 使用的锁的代码package com.zhuangxiaoyan.jdk.juc.JucLock;
import java.time.LocalDate;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Classname ProducerSumer
* @Description
* @Date 2021/11/27 7:59
* @Created by xjl
*/
class ShareData{
private int number=0;
private Lock lock=new ReentrantLock();
private Condition condition=lock.newCondition();
public void increment()throws Exception{
lock.lock();
try {
//判断
while (number!=0){
//等待 不能生产
condition.await();
}
//干活
number++;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//通知唤醒
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void decrement()throws Exception{
lock.lock();
try {
//判断
while (number==0){
//等待 不能生产
condition.await();
}
//干活
number--;
System.out.println(Thread.currentThread().getName()+"\t"+number);
//通知唤醒
condition.signalAll();
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class ProducerSumer {
public static void main(String[] args) {
ShareData shareData=new ShareData();
new Thread(()->{
for (int i=1;i{
for (int i=1;i {
System.out.println(Thread.currentThread().getName() + "\t生产线程启动……");
try {
myResource.Producer();
} catch (Exception e) {
e.printStackTrace();
}
}, "生产线程").start();
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t消费线程启动……");
try {
myResource.Consumer();
} catch (Exception e) {
e.printStackTrace();
}
}, "消费线程").start();
TimeUnit.SECONDS.sleep(5);
System.out.println("停止生产和消费的过程……");
myResource.stop();
}
}
模拟多线程的顺序调用
多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下: AA打E印5次,BB打印10次,CC打E15次。
package com.zhuangxiaoyan.jdk.juc.JucLock;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* @Classname ReentrantLockDemo
* @Description 多线程之间按顺序调用,实现A->B->C三个线程启动,要求如下: AA打E印5次,BB打印10次,CC打E15次
* @Date 2021/11/27 8:21
* @Created by xjl
*/
class ShareResource{
private int number=1;
private Lock lock=new ReentrantLock();
private Condition c1=lock.newCondition();
private Condition c2=lock.newCondition();
private Condition c3=lock.newCondition();
public void printA(){
lock.lock();
try {
//判断
while (number!=1){
c1.await();
}
//干活
for (int i=1;i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?