您当前的位置: 首页 > 

庄小焱

暂无认证

  • 2浏览

    0关注

    805博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK源码——多线程实战

庄小焱 发布时间:2021-11-27 08:43:42 ,浏览量:2

摘要

本博文主要是介绍多线程中的实战问题。通过实际的代码和例子提供大家更多练习和学习以及参考。

模拟多消费者和多生产者的的产生和消费问题 使用的锁的代码
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            
关注
打赏
1657692713
查看更多评论
0.0439s