美文网首页
四个线程,两个加减法线程对数据加减的调度模拟-java

四个线程,两个加减法线程对数据加减的调度模拟-java

作者: 修玛哦 | 来源:发表于2020-08-05 16:26 被阅读0次

其实此题是模拟多用户对相同资源的操作。网上大多解法只是解决了基本的同步问题,并未解决对于资源的控制。

  • 可使用lock condition条件对象及await() signalALL()来解决问题。
package com.javalearn;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Resources {
    private int data;
    private Lock lock;
    private Condition lastData;

    public Resources() {
        this.data = 0;
        this.lock = new ReentrantLock();
        this.lastData = lock.newCondition();
    }

    public void dec() throws InterruptedException {
        lock.lock();
        try {
            while (this.data==0)
                lastData.await();
            this.data--;
            System.out.println(Thread.currentThread()+" "+this.data);
            lastData.signalAll();
        } finally {
            lock.unlock();
        }
    }
    public void inc() throws InterruptedException {
        lock.lock();
        try {
            while (this.data==1)
                lastData.await();
            this.data++;
            System.out.println(Thread.currentThread()+" "+this.data);
            lastData.signalAll();
        } finally {
            lock.unlock();
        }
    }
    public static void main(String[] args) {
        Resources res = new Resources();
        for (int i = 0; i < 100; i++) {
            new Thread(()->{
                for (int j = 0; j < 100; j++) {
                    try {
                        res.dec();
                        Thread.sleep(15);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },"decrement"+i).start();
        }
        for (int i = 0; i < 10; i++) {
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    try {
                        res.inc();
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },"increment"+i).start();
        }
    }
}


  • 可使用synchronized及wait()和notifyALL()来解决。
package com.javalearn;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Resources {
    private int data = 0;
    public synchronized void dec() throws InterruptedException {
        while (this.data==0)
            wait();
        this.data--;
        System.out.println(Thread.currentThread()+" "+this.data);
        notifyAll();
    }
    public synchronized void inc() throws InterruptedException {
        while (this.data==1)
            wait();
        this.data++;
        System.out.println(Thread.currentThread()+" "+this.data);
        notifyAll();
    }
    public static void main(String[] args) {
        Resources res = new Resources();
        for (int i = 0; i < 100; i++) {//此处设置加法线程数量
            new Thread(()->{
                for (int j = 0; j < 100; j++) {
                    try {
                        res.dec();
                        Thread.sleep(15);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },"decrement"+i).start();
        }
        for (int i = 0; i < 10; i++) {//此处设置减法线程数量
            new Thread(()->{
                for (int j = 0; j < 1000; j++) {
                    try {
                        res.inc();
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },"increment"+i).start();
        }
    }
}

两种代码都是比较标准的模板,可以参考使用。建议使用较为简洁的第二种类。l

相关文章

  • 四个线程,两个加减法线程对数据加减的调度模拟-java

    其实此题是模拟多用户对相同资源的操作。网上大多解法只是解决了基本的同步问题,并未解决对于资源的控制。 可使用loc...

  • java虚拟机读书笔记之线程调度

    java线程调度 线程调度主要有两种方式,协同式线程调度和抢占式线程调度。1、协同式: 线程的执行时间由线程本身...

  • Java线程模型

    Java线程模型 本文将从线程类型、线程通信、线程调度三个方面分析Java中的线程模型。 什么是线程? 线程就是进...

  • Java线程相关学习笔记

    Java 线程相关 如何创建线程(两种方式,区别,使用场景)线程状态调度多线程数据共享(会有什么问题,如何实现共享...

  • Java 多线程基础

    java 多线程 标签(空格分隔): java 线程和进程 进程具有独立的数据空间,是系统进行资源分配和调度的独立...

  • java线程

    java 线程的方式 :抢占式调度 线程的方法:getName() //获取线程名字 getcurrentThre...

  • 线程优先级和守护线程

    线程优先级: Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定调度哪个...

  • 并发--线程和锁

    线程调度 协同式调度 1.一个线程执行完毕之后再通知其他线程执行 抢占式调度(JAVA使用的是这种方式) 1.os...

  • 多线程综合案例

    数字加减 设计四个线程对象,两个线程执行减操作,两个线程执行加操作; 生产电脑 设计一个生产电脑和搬运电脑类,要求...

  • Java多线程面试准备:聊聊Executor框架

    Executor框架的两级调度模型 在HotSpot VM的线程模型中,Java线程被一对一映射为本地操作系统线程...

网友评论

      本文标题:四个线程,两个加减法线程对数据加减的调度模拟-java

      本文链接:https://www.haomeiwen.com/subject/llcorktx.html