当前位置: 首页 > 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.dtcms.com/a/267974.html

相关文章:

  • 跨平台游戏引擎 Axmol-2.7.0 发布
  • @Data、@AllArgsConstructor、@NoArgsConstructor不生效。lombok不起作用怎么解决?
  • 设置LInux环境变量的方法和区别_Ubuntu/Centos
  • 网页怎么不使用工具截图和长图
  • 《Spring AI实战:Java智能开发速成指南》
  • D435i + ROS2
  • 利用selenium获取网页数据,脚本加载慢问题的解决办法
  • CentOS环境搭建-快速升级G++版本
  • 【CSS样式】有趣的滑块开关
  • 深入理解 classnames:React 动态类名管理的最佳实践
  • 20250706-6-Docker 快速入门(上)-镜像是什么?_笔记
  • TNNLS期刊接受后,最终版提交说明
  • QT - QCustomPlot
  • Next.js面试常问内容详解
  • 【网络安全基础】第八章---电子邮件安全
  • 5种高效解决Maven依赖冲突的方法
  • 基于SpringBoot和Leaflet集成在线天气服务的区县当前天气WebGIS实战
  • 手机电工仿真软件更新了
  • Typecho主题开发指南:现代框架布局与SEO优化实践
  • 基于SSM和JSP开发的旅游系统
  • [论文阅读] 人工智能 + 软件工程 | 自然语言驱动结构代码搜索:突破DSL学习壁垒的创新方法
  • HRDNet: High-resolution Detection Network for Small Objects论文阅读
  • 7.6 hash | rust
  • 408第三季part2 - 计算机网络 - 传输层II
  • 前端开发问题:TypeError: records is not iterable
  • Gin Web 层集成 Viper 配置文件和 Zap 日志文件指南(下)
  • Spring Cloud Alibaba/Spring Boot整合华为云存储实例(REST API方式)
  • 记一次JVM问题排查
  • 字节二面:进程,线程,协程区别
  • K8s系列之:Kubernetes 的 OLM