java多线程-练习

devtools/2024/10/19 2:20:22/

需求

在这里插入图片描述

代码

  • 使用Callable 方便返回执行的结果:每个线程的发送礼物的数量
  • 礼物清单:共享资源,方便上锁
  • 礼物数量:线程变量,每个线程发送礼物的数量
java">public class SendGiftThread implements Callable<Integer> {// 共享资源 礼物清单private ArrayList<String> giftList;// 此线程已经送出的礼物数量private int count = 0;public SendGiftThread(ArrayList<String> giftList) {this.giftList = giftList;}public int getCount() {return count;}@Overridepublic Integer call() throws Exception {Random random = new Random();while (giftList.size() > 10){// 锁住的不一定是this,一定要是共享资源synchronized (giftList){// 礼物大于10个时,随机送出一个礼物if (giftList.size() > 10){int index = random.nextInt(giftList.size());// 送出礼物String remove = giftList.remove(index);// 送出礼物数量+1count++;System.out.println(Thread.currentThread().getName() + "送出了" + remove + ",已送出" + count + "个礼物");}}}return count;}
}
  • 创建两个Callable对象
  • 使用未来任务FutureTask进行封装
  • 创建两个线程
java">public static void main(String[] args) {// 随机生成100个礼物ArrayList<String> giftList = new ArrayList<>();String[] names = {"口红", "手机", "电脑", "手表", "鞋子", "衣服", "裤子", "帽子", "围巾", "手套", "袜子", "饰品", "包包", "眼镜", "钱包", "皮带", "项链", "手链", "戒指", "耳环"};Random random = new Random();for (int i = 0; i < 100; i++) {giftList.add(names[random.nextInt(names.length)]+"-"+i);}// 创建两个任务SendGiftThread sendGiftThread1 = new SendGiftThread(giftList);SendGiftThread sendGiftThread2 = new SendGiftThread(giftList);Future<Integer> future1 = new FutureTask<>(sendGiftThread1);Future<Integer> future2 = new FutureTask<>(sendGiftThread2);// 创建两个线程Thread thread1 = new Thread((Runnable) future1, "小红");Thread thread2 = new Thread((Runnable) future2, "小明");// 启动线程thread1.start();thread2.start();// 打印线程返回结果try {System.out.println("小红送出了" + future1.get() + "个礼物");System.out.println("小明送出了" + future2.get() + "个礼物");} catch (Exception e) {e.printStackTrace();}}

http://www.ppmy.cn/devtools/11519.html

相关文章

UUPSUpgradeable部署合约和升级合约

文章目录 写一个合约1. 使用代理部署 并添加拥有者2. 没有name number为103. 使用代理升级部署 填写上面代理的合约地址4. 合约地址没有变&#xff0c;但是添加了name&#xff0c;并且保存了number的属性值 写一个合约 // SPDX-License-Identifier: MIT // Compatible with Op…

全新创维EV6 Ⅱ超充车型有哪些亮点?答案将在北京车展揭晓

4月25日-5月4日&#xff0c;阔别4年的北京车展盛大回归&#xff0c;创维汽车将携全新车型创维EV6 Ⅱ超充车型及系列创新技术&#xff0c;亮相北京中国国际展览中心顺义馆W3号馆 311展位&#xff0c;全面展示其在新能源汽车补能及智能化领域的前瞻思考和技术布局。 以顶级超充革…

nvm使用指定镜像安装node和npm包

场景 使用nvm时&#xff0c;默认的安装源经常碰到找不到可用版本的问题&#xff0c;这时就需要指定镜像源。比如如果你在学习鸿蒙ArkTs项目的开发&#xff0c;就需要指定从华为官方镜像上安装指定版本的node和npm包 命令 以windows为例&#xff0c;以管理员身份运行cmd工具&…

【webrtc】m114自己实现的PrioritizedPacketQueue及优先级处理

G:\CDN\WEBRTC-DEV\libwebrtc_build\src\modules\pacing\prioritized_packet_queue.h跟m98不同 :webrtc】m98 RoundRobinPacketQueue的优先级处理,m114直接使用taskqueue顺序处理了。甚至自己实现了优先级队列感觉简化了实现,更为清晰 易读,但是去掉了码率低就优先的逻辑。1…

《魔兽世界》本人收集的二十六个单机版游戏,内有视频架设教程,非常详细,云盘下载

《魔兽世界》&#xff08;World of Warcraft&#xff09;属于大型多人在线角色扮演游戏。 《魔兽世界》本人收集的二十六个单机版游戏&#xff0c;内有视频架设教程&#xff0c;非常详细 下载地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1zu7lUNupkPnLPVYHM4jL5…

OpenHarmony UI动画-lottie

简介 lottie是一个适用于OpenHarmony的动画库&#xff0c;它可以解析Adobe After Effects软件通过Bodymovin插件导出的json格式的动画&#xff0c;并在移动设备上进行本地渲染。 下载安裝 ohpm install ohos/lottieOpenHarmony ohpm 环境配置等更多内容&#xff0c;请参考如何…

Jenkins打包app并通过openssh上传到服务器

目录 1、下载安装openssh 2、配置openssh根目录 3、安装Jenkins Build Steps配置 Post-build Actions配置 4、运行 1、下载安装openssh 网上很多教程&#xff0c;包括开端口的&#xff0c;可以搜下 2、配置openssh根目录 进入C:\ProgramData\ssh打开文件sshd_config&am…

服务器 BMC(基板管理控制器,Baseboard Management Controller)认知

写在前面 工作中遇到&#xff0c;简单整理博文内容涉及 BMC 基本认知理解不足小伙伴帮忙指正 不必太纠结于当下&#xff0c;也不必太忧虑未来&#xff0c;当你经历过一些事情的时候&#xff0c;眼前的风景已经和从前不一样了。——村上春树 基板管理控制器&#xff08;BMC&…