当前位置: 首页 > news >正文

java学习——guava并发编程练习

一直学习理论怎么能不做练习呢?下面我将出几个编程题来巩固编程。

练习1:

新建三个线程,使用并发编程,同时计算三个线程的数并且输出计算的过程,线程1计算从1加到100,线程2计算50的阶乘,线程三计算根号三并且输出小数点后十位。

答案

import com.google.common.util.concurrent.*;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.math.MathContext;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;public class MultiThreadCalculator {// 创建监听线程池private static final ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(3));public static void main(String[] args) {// 启动三个计算任务ListenableFuture<?> additionFuture = executor.submit(new AdditionTask());ListenableFuture<?> multiplicationFuture = executor.submit(new MultiplicationTask());ListenableFuture<?> sqrtFuture = executor.submit(new SquareRootTask());// 添加回调处理异常Futures.addCallback(additionFuture, new LoggingCallback(), executor);Futures.addCallback(multiplicationFuture, new LoggingCallback(), executor);Futures.addCallback(sqrtFuture, new LoggingCallback(), executor);// 等待所有任务完成ListenableFuture<?> allFutures = Futures.allAsList(additionFuture, multiplicationFuture, sqrtFuture);try {allFutures.get();System.out.println("\n所有计算任务完成!");} catch (Exception e) {e.printStackTrace();} finally {executor.shutdown();}}// 加法任务:计算1加到100static class AdditionTask implements Runnable {@Overridepublic void run() {int sum = 0;for (int i = 1; i <= 100; i++) {sum += i;System.out.println("[加法线程] 添加 " + i + " → 当前总和: " + sum);Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS);}System.out.println("\n[加法线程] 最终结果: 1到100的和 = " + sum);}}// 乘法任务:计算2乘到50(使用BigInteger避免溢出)static class MultiplicationTask implements Runnable {@Overridepublic void run() {BigInteger product = BigInteger.ONE;for (int i = 2; i <= 50; i++) {product = product.multiply(BigInteger.valueOf(i));System.out.println("[乘法线程] 乘以 " + i + " → 当前乘积: " + product);Uninterruptibles.sleepUninterruptibly(70, TimeUnit.MILLISECONDS);}System.out.println("\n[乘法线程] 最终结果: 2到50的乘积 = " + product);}}// 开方任务:计算√3的小数点后10位数字static class SquareRootTask implements Runnable {@Overridepublic void run() {// 计算√3到小数点后20位精度BigDecimal sqrt3 = BigDecimal.valueOf(3).sqrt(new MathContext(20));String decimalPart = sqrt3.toString().split("\\.")[1];System.out.println("[开方线程] √3 完整值: " + sqrt3);// 输出小数点后10位数字for (int i = 0; i < 10; i++) {if (i < decimalPart.length()) {char digit = decimalPart.charAt(i);System.out.println("[开方线程] 小数点后第" + (i+1) + "位: " + digit);} else {System.out.println("[开方线程] 小数点后第" + (i+1) + "位: 0");}Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);}// 只输出前10位小数String result = decimalPart.length() >= 10 ? decimalPart.substring(0, 10) : decimalPart;System.out.println("\n[开方线程] 最终结果: √3 ≈ " + result);}}// 通用回调处理static class LoggingCallback implements FutureCallback<Object> {@Overridepublic void onSuccess(Object result) {// 任务成功完成,无需特别处理}@Overridepublic void onFailure(Throwable t) {System.err.println("任务失败: " + t.getMessage());t.printStackTrace();}}
}

练习2

和练习1一样,对线程的执行顺序有要求,要求线程1执行一半时执行线程2,线程2执行一半时执行线程3,等待线程3执行完毕后再执行线程2,线程2执行完毕后执行线程1,要求分清不同线程的执行过程

答案:

package org.example;import com.google.common.util.concurrent.*;import java.math.BigDecimal;
http://www.lryc.cn/news/581463.html

相关文章:

  • 【Guava】1.0.设计虚拟机的方向
  • 第一个Flink 程序:词频统计 WordCount(流处理)
  • LeetCode--41.缺失的第一个正数
  • 《Redis》缓存与分布式锁
  • AGV选型指南:AGV智能搬运车智能问答系统助力从技术参数到供应商选择的完整方案
  • Flutter 项目开启 UI 层级虚线(UI Guides)
  • 深度学习篇---简单果实分类网络
  • JAVA 项目找不到符号
  • 零依赖Web数据管理系统:midb轻松管理
  • Node.js EventEmitter 深入解析
  • 数据挖掘:从理论到实践的深度探索
  • C++学习之STL学习:list的模拟实现
  • DTW模版匹配:弹性对齐的时间序列相似度度量算法
  • 处理GET请求:在Web开发中如何处理GET请求
  • 【C语言指南】深入剖析 C 语言递归函数
  • 爬虫-浏览器工具简介
  • ch03 部分题目思路
  • Qt实战:使用QSqlDatabase连接MySQL,并实现增删改查
  • 使用Python将PDF转换成word、PPT
  • 网络编程底层通信(socket)
  • 人工智能安全基础复习用:隐私保护
  • 力扣网编程45题:跳跃游戏II之正向查找方法(中等)
  • 群晖(Synology)存储ext4视频文件删除的恢复方法
  • 基于Pandas和FineBI的昆明职位数据分析与可视化实现(五) - 基于随机森林算法预测职位分类
  • MySQL主从复制与读写分离概述
  • 【AI大模型】Spring AI 基于mysql实现对话持久存储详解
  • Neo4j 综合练习作业
  • 7,TCP服务器
  • 卫星通信终端天线的5种对星模式之一:信标跟踪
  • mysql的JDBC和连接池