首页 > 其他分享 >多线程抢沙包游戏

多线程抢沙包游戏

时间:2024-05-25 14:07:19浏览次数:20  
标签:多线程 游戏 Thread 沙包 System println new total

幼儿园玩抢沙包游戏,共计100个沙包,有10个小朋友(4男6女),男生每次拿3个沙包,女生每次拿2个沙包,如果剩余的沙包不够每次拿的数量,则游戏停止,请用java多线程模拟上述游戏过程。

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 幼儿园玩抢沙包游戏,共计100个沙包,有10个小朋友(4男6女),男生每次拿3个沙包,女生每次拿2个沙包,
 * 如果剩余的沙包不够每次拿的数量,则游戏停止,请用java多线程模拟上述游戏过程。
 */
public class SnatchingSandbags {

    private static volatile int total = 100;
    private static Lock l = new ReentrantLock();
    private static CountDownLatch countDownLatch = new CountDownLatch(10);
    public static void main(String[] args) {
        BoyRunLock boy = new BoyRunLock();
        GirlRunLock girl = new GirlRunLock();
        List<Thread> threadList= new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            threadList.add(new Thread(boy, "boy" + (i + 1)));
        }
        for (int i = 0; i < 6; i++) {
            threadList.add(new Thread(girl, "girl" + (i + 1)));
        }
        for (Thread thread : threadList) {
            thread.start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(total);
        //以下代码测试tryLock,可以看出tryLock能让更多小朋友拿到沙袋
        total = 100;
        CountDownLatch countDownLatch = new CountDownLatch(10);
        BoyRun boyRun = new BoyRun();
        GirlRun girlRun = new GirlRun();
        threadList= new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            threadList.add(new Thread(boyRun, "boy" + (i + 1)));
        }
        for (int i = 0; i < 6; i++) {
            threadList.add(new Thread(girlRun, "girl" + (i + 1)));
        }
        for (Thread thread : threadList) {
            thread.start();
        }
        try {
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(total);
    }

    static class BoyRun implements Runnable {

        @Override
        public void run() {
            while (total >= 3) {
                if (l.tryLock()) {
                    if (total >= 3) {
                        System.out.println("threadName:" + Thread.currentThread().getName() + "BoyRun current total:" + total + ",after total:" + (total -= 3));
                    }
                    l.unlock();
                }
            }
            System.out.println("BoyRun end");
            countDownLatch.countDown();
        }
    }

    static class BoyRunLock implements Runnable {

        @Override
        public void run() {
            while (total >= 3) {
                l.lock();
                if (total >= 3) {
                    System.out.println("threadName:" + Thread.currentThread().getName() + "BoyRun current total:" + total + ",after total:" + (total -= 3));
                }
                l.unlock();
            }
            System.out.println("BoyRun end");
            countDownLatch.countDown();
        }
    }

    static class GirlRun implements Runnable {

        @Override
        public void run() {
            while (total >= 2) {
                if (l.tryLock()) {
                    if (total >= 2) {
                        System.out.println("threadName:" + Thread.currentThread().getName() + "GirlRun current total:" + total + ",after total:" + (total -= 2));
                    }
                    l.unlock();
                }
            }
            System.out.println("GirlRun end");
            countDownLatch.countDown();
        }
    }

    static class GirlRunLock implements Runnable {

        @Override
        public void run() {
            while (total >= 2) {
                l.lock();
                if (total >= 2) {
                    System.out.println("threadName:" + Thread.currentThread().getName() + "GirlRun current total:" + total + ",after total:" + (total -= 2));
                }
                l.unlock();
            }
            System.out.println("GirlRun end");
            countDownLatch.countDown();
        }
    }
}

标签:多线程,游戏,Thread,沙包,System,println,new,total
From: https://www.cnblogs.com/zhengbiyu/p/18212346

相关文章

  • 深入解析Python并发的多线程和异步编程
    在Python编程中,多线程是一种常用的并发编程方式,它可以有效地提高程序的执行效率,特别是在处理I/O密集型任务时。Python提供了threading模块,使得多线程编程变得相对简单。本文将深入探讨threading模块的基础知识,并通过实例演示多线程的应用。1.多线程基础概念在开始之前,让我们......
  • 最新试玩小游戏全自动挂机项目,单窗口100+
    项目介绍:今天我要向大家介绍一个通过各大平台小游戏试玩的赚钱项目。大家都知道,抖音、快手等直播平台上的主播会在游戏铃铛上挂游戏铃铛,下载并玩一会儿游戏,就能获得收益。这种原理我们也可以利用脚本实现,叫做试玩。试玩分为4种不同的类型,分别是下载量、注册量、浏览量和试玩......
  • WinSock 的多线程编程
    目录概述Winsock为什么需要多线程阻塞模式和非阻塞模式单线程和多线程的优缺点Win32系统下的多进程多线程机制进程和线程线程创建线程同步线程通信  VC++对多线程网络编程的支持MFC中的多线程支持ATL中的多线程支持多线程FTP客户端实例头文件包含线......
  • 基于Python的性能优化--多线程、协程、多进程
    合集-Python(1) 1.基于Python的性能优化05-24收起 一、多线程在CPU不密集、IO密集的任务下,多线程可以一定程度的提升运行效率。importthreadingimporttimeimportrequestsdeffetch_url(url:str)->None:'''根据地址发起请求,获取响应-url:......
  • 看广告收益小游戏app对接聚合SDK广告开发
    将专业的广告变现交给专业的第三方来打理,轻松获得广告变现收益,本文就带你读懂什么是聚合SDK广告。01聚合SDK是什么?通过技术能力将多个预算进行集成,让开发者可以一键接入多个预算资源,从而减轻开发者的对接成本,实现广告变现的目的。开发者接入一家聚合SDK广告等同于接入多......
  • 使用python uiautomation模块,结合多线程快速寻找控件
    文章目录1.形式一2.形式二1.形式一该方法使用多线程进行搜索,主线程不会等待所有子线程返回结果后再继续执行,而是在获取队列中第一个结果后立即继续执行。优势在于一旦有子线程找到结果,主线程就能立即继续执行;劣势在于未找到结果的子线程会持续搜索,直到达到设定的最大......
  • Java JUC&多线程 基础完整版
    JavaJUC&多线程基础完整版目录JavaJUC&多线程基础完整版1、多线程的第一种启动方式之继承Thread类2、多线程的第二种启动方式之实现Runnable接口3、多线程的第三种实现方式之实现Callable接口4、多线的常用成员方法5、线程的优先级6、守护线程7、线程的让出8、线程插队9、同......
  • GeminiDB PITR,让游戏回档“进退自如”!
    本文分享自华为云社区《GeminiDBPITR,让游戏回档“进退自如”!》,作者:GaussDB数据库。在实际业务场景中,客户数据库难免会出现数据损毁、数据丢失、数据误删除等故障场景。为保障业务的正常运行,通常需要将数据库恢复到故障发生前的某一个正常时刻。传统数据库采取周期性备份策略,即......
  • Python多线程案例分析
    接下来,我们将在之前的基础上进一步扩展多线程爬虫案例,增加以下功能:1.动态URL发现与添加:爬虫在解析页面时,能够发现并添加新的URL到队列中。2.设置请求头:模拟浏览器行为,设置请求头中的`User-Agent`。3.使用会话:使用`requests.Session()`对象来保持连接,提高效率。4.避免重......
  • CSP历年复赛题-P1043 [NOIP2003 普及组] 数字游戏
    原题链接:https://www.luogu.com.cn/problem/P1043题意解读:将n个环形数分成任意m组,组内求和再%10、负数转正,组间相乘,求所有分组方案中得到结果的最小值和最大值。解题思路:比赛题的首要目的是上分!此题一看就是DP,但是苦苦思索了半天,想不清楚状态表示,那么可以换换策略,先暴力得分再......