Java多线程——计算1-20阶乘和

article/2025/4/29 11:53:00

Java多线程--计算1-20的阶乘和

  • 一、总体思路
    • 效果预览
    • 线程分工
  • 二、设计线程类
    • GUI
    • Thread
    • Runnable
  • 三、总结

一、总体思路

初次学习Java的时候,学习了多线程的理论知识后,就开始练习创建线程的两种方法,即通过继承Thead类构造线程 和 通过实现Runnable接口构造线程。大家应该都遇到过这样的练习题:用上述两种方法创建线程,分别实现计算和获取计算结果,计算的内容便是1-20的阶乘和,再用一个图形用户界面把相关结果按一定要求显示出来。

效果预览

此处的图形用户界面类似下图:

显示线程的图形用户界面
当用户按下“开始计算”按钮时,逐步显示计算计算信息,从此可以看出线程进行的过程。

线程分工

这里一共有三个线程,1:GUI的主线程;2:继承Thread类的线程;3:实现Runnable的类的线程。具体分工如下:两个线程中的任意一个用来单纯实现计算功能,另一个作为连接的桥梁,获取计算线程的计算结果,并将其显示到GUI主线程的界面中去。至于GUI,当然就是显示线程的作用了。

二、设计线程类

GUI

创建GUI的简单方式就是下载一个Window Builder插件到eclipse中,新建的时候,选择file——new——other——WindowBuilder——Swing Designer——Application Window新建一个window应用程序。当然你也可以选择SWT Designer,只是这里面有的Swing里面都有。你更可以选择不使用插件,这时候你的代码就会是类似于这样的(用Java写记事本程序的代码片段):

    public int num1 = 0,num2 = 0,result = 0;//保存运算整数public String bufferString = "";//获取文本框中的字符串public String operString = "";//运算符JFrame jFrame;Container contentPane;public JTextField jTextField;//文本框public JButton b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;//数字按钮public JButton bPlus,bReduce,bRide,bDivede;//加、减、乘、除public JButton bEqual,bReset;//等号、复位public JPanel jPanel1,jPanel2;//设置两个Panel

你就感受不到自动生成的乐趣,而是要把所有的东西都手动敲出来。。。想想就脑阔痛啊。不过好处是,你可以把这个过程的原理了解清楚,这对初学Java的同学是有很大帮助的。

好了,在这里,GUI的设计主要就是界面和卫唯一的一个事件–按钮事件,注册一个ActionLitsener就可响应它了,具体做法见代码吧:

public void actionPerformed(ActionEvent e) {CoutingThread ct = new CoutingThread();//创建thread对象ct.start();//用对象调用start方法,启动线程,执行run方法的内容Thread reader  = new Thread(new Start());//创建线程对象reader.start();}

Thread

这里就用Thread的子类线程来实现计算功能吧。计算的代码不难,一个循环就能搞定,但是如果要获取每次加法的结果的话,就要考虑怎么把值传给获取线程。这时候你需要一个数组来帮助你,把每次加法的结果存到数组里,然后每次取数的时候取相应位置上的元素,再加以显示就完事了。代码类似下方:

public void run() {//for(int i =1;i<=20;i++)//{//result += i;//step++;//ex = i+"";//}//这是1-20加法的简单代码,如果一开始觉得阶乘难于实现,可以先做整数的简单加法long mul = 1; //保存阶乘数result = new long[30];//数组保存每次加法的结果result[1] = 1;//从2开始循环,因此把1号位的初值赋好,下同step  = new int[30];//保存计算进度(1-20)step [1] = 1;ex = new String[30];//字符串数组保存计算表达式ex[1] = 1+"!";for(int i = 2; i <= 20; i++){try {Thread.currentThread().sleep((int)(Math.random()*500)+500);//设置休眠时间为0.5-1.0秒的随机数} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}mul = mul*i;//设置阶乘数result[i] = result[i-1] + mul;//设置计算结果step[i] = step[i-1]+1;//设置进度条ex[i] =  ex[i-1] +"+" + i +"!";//设置计算表达式}}

当然,如果你在计算线程里面完成了显示功能,就不用考虑这么多了。

public void run() {long s = 1;//长整型储存计算结果for(i=1; i<=30; i++){if(str1.equals("")){//判断是否是第一个显示的数据str1 = i + "!";}else{str1 += "+" + i + "!";}//long s = 1;//for(int j=1; j<=i; j++){s *= i;//	}result += s;threadFrame.jTextField1.setText(str1);//显示计算表达式threadFrame.jProgressBar.setValue(i);//显示进度try {Thread.sleep((long)(500 + 500 * Math.random()));} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("第1个线程休眠时出错!");//处理异常}}	} 

Runnable

桥梁线程要做的就是从一个线程里获取数据显示到另一个线程中。需要注意的是,你要将该线程中需要用的其他两个线程的对象设为public,即扩大其范围。并在获取线程中的run方法外将其设为属性,具体做法如下:

	ComputeThread computer;computeApp window;ReadRunnable(ComputeThread computer,computeApp window){this.computer = computer;this.window = window;}

这里使用了构造方法给两个线程的对象完成初始化工作。
完成连接的代码如下:

	public void run() {// TODO Auto-generated method stubtry {for(int n = 1; n<=20; n++) {Thread.currentThread().sleep(1000);window.progressbar.setValue(computer.step[n]);//显示进度条window.textex.setText(computer.ex[n]);//显示计算表达式window.textresult.setText(computer.result[n]+"");//显示计算结果}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}

三、总结

综合性实验,总体思路要清晰,细节也很重要。连接线程是核心,计算也是核心。在这里我就是想分享一下自己的计算方法,即用数组存放数据,这也是数据处理的方法技巧。当然算法千万种,哪一款适合你就需要你自己去摸索和选择。

个人总结,有错误还请指出~


http://chatgpt.dhexx.cn/article/gpa7X7DJ.shtml

相关文章

求n从1到20阶乘的和(即1+2!+3!+4!+...+20!)

求12!3!4!…20! 首先需要一个大循环&#xff0c;从1到20&#xff0c;然后在小循环里计算N阶乘&#xff0c;使用到累加求和&#xff0c;即可得出最后结果 代码已经过编译&#xff0c;可直接进行使用 #include<stdio.h> float flag(int n)//求n阶乘 {float p1;for(int …

20阶乘matlab,matlab如何调用阶乘函数求阶乘的和

比如for i1&#xff1a;10A(i&#xff0c;&#xff1a;)&#xff3b;i fac(i)&#xff3d;end其中fac(n)为求阶乘的函数&#xff0c;他保存在fac.m中&#xff0c;>> prod(1:5)ans 120www.mh456.com防采集。 MATLAB求阶乘函数为&#xff1a;factorial(),直接调用即可&…

C语言 递归求20的阶乘

C语言 递归求20的阶乘 #include <stdio.h> #include <string.h> #include <Windows.h> double jiecheng(); int main() {int i1;for (i1;i<20;i){printf("%2d! %.2f\n",i,jiecheng(i)); }system("pause");return 0; } doubl…

如何花式计算20的阶乘?

今天刷知乎看到个挺有意思的问题&#xff1a;「如何优雅地利用c编程从1乘到20&#xff1f;」 如何优雅地利用c编程从1乘到20&#xff1f; 我想这有啥难的&#xff0c;还能写出花来不成&#xff1f;结果看到高赞回答&#xff0c;感觉自己的智商有点不够用了。 随便来看一个高赞…

chatgpt赋能Python-python20的阶乘

Python20的阶乘&#xff1a;介绍和计算方法 如果你正在学习Python编程&#xff0c;那么你一定听说过阶乘&#xff08;factorial&#xff09;。Python20&#xff0c;也就是2的20次方&#xff0c;是一个非常大的数字&#xff0c;计算它的阶乘是很困难的。本文将介绍什么是阶乘&a…

7、Callable接口

7.1、Calledable接口与Runnable接口的区别 是否有返回值 Calledable 有返回值&#xff1b;Runnable无返回值 是否抛出异常 Calledable 会抛出异常&#xff1b;Runnable不会抛出异常 实现方法名称不同 Calledable 实现的是call方法&#xff1b;Runnable实现的是run方法 7…

第五篇、Callable接口实现多线程

文章目录 前言一、实现Callable接口二、代码示例1.Callable接口实现多线程 总结 前言 上一篇我们共同认识了并发问题&#xff0c;那么本篇我们将一起来学习Callable接口实现多线程。 一、实现Callable接口 上篇内容我们通过实现Runnable实现多线程&#xff0c;本篇我们将学习…

高并发之——深入解析Callable接口

本文纯干货&#xff0c;从源码角度深入解析Callable接口&#xff0c;希望大家踏下心来&#xff0c;打开你的IDE&#xff0c;跟着文章看源码&#xff0c;相信你一定收获不小。 1.Callable接口介绍 Callable接口是JDK1.5新增的泛型接口&#xff0c;在JDK1.8中&#xff0c;被声明…

简单理解Callable接口

Callable接口: Callable,新启线程的一种方式,返回结果并且可能抛出异常的任务,在前面的新启线程的文章中用过,但是没有具体讲解 优点: 可以获取线程的执行结果,也称为返回值 通过与Future的结合,可以实现利用Future来跟踪异步计算的结果 Runnable和Callable的区别: Callable规定…

从源码角度详解Java的Callable接口

摘要&#xff1a;本文从源码角度深入解析Callable接口。 本文分享自华为云社区《深入解析Callable接口》&#xff0c;作者&#xff1a; 冰 河 。 本文纯干货&#xff0c;从源码角度深入解析Callable接口&#xff0c;希望大家踏下心来&#xff0c;打开你的IDE&#xff0c;跟着文…

Callable 接口实现java 的多线程

java 中创建多线程最常见的是继承Thread 的子类重写run() 方法&#xff0c;还有就是实现Runnable 接口 我们最好使用实现了Runnable 接口的方法原因有两点&#xff1a; ①因为java 的单继承的特点&#xff0c;所以说使用第一种方法不能继承其他父类了 ②采用接口的方式便于实现…

Callable接口的使用和介绍

Callable public interface Callable<V>返回结果并可能引发异常的任务。 实现者定义一个没有参数的单一方法&#xff0c;称为call 。 Callable接口类似于Runnable &#xff0c;因为它们都是为其实例可能由另一个线程执行的类设计的。 然而&#xff0c;A Runnable不返回…

实现Callable接口

一、实现Callable接口 实现Callable接口&#xff0c;需要返回值类型重写call方法&#xff0c;需要抛出异常创建目标对象创建执行服务: ExecutorService ser Executors.newFixedThreadPool(1);提交执行: Future result1 ser.submit(t1);获取结果: boolean r1 result1 .get()…

Callable接口的理解

Callable接口的定义 FunctionalInterface public interface Callable<V> {V call() throws Exception; }可以看出Callable就是一个拥有call方法的接口&#xff0c;可以把线程中需要执行过程定义到call方法中&#xff0c;跟Runnable接口一样&#xff0c;最终的执行还是需…

java callable接口_Java Callable接口

一 理论 Runnable是执行工作的独立任务&#xff0c;但是不返回任何值。如果我们希望任务完成之后有返回值&#xff0c;可以实现Callable接口。在JavaSE5中引入的Callable是一个具有类型参数的范型&#xff0c;他的类型参数方法表示为方法call()而不是run()中返回的值&#xff0…

6.实现 Callable 接口

6.实现 Callable 接口 前言 本篇章来介绍一下创建线程的第三种方式&#xff0c;其中创建线程一共有四种方式&#xff1a; 继承 Thread 类 实现 Runnable 接口 实现 Callable 接口 使用线程池的方式 那么下面我们来介绍一下 实现 Callable 接口的方式。 Callable 接口 - Jav…

3、创建线程方式三:实现Callable接口

一、步骤 1、定义一个线程任务类实现Callable接口&#xff0c;声明线程执行的结果类型。 2、重写线程任务类的call()方法&#xff0c;这个方法可以直接返回执行的结果。 3、创建一个Callable的线程任务对象。 4、把Callable的线程任务对象包装成一个未来任务对象。 5、把未来任…

JUC之Callable接口

Callable 创建线程有四种方式: 继承Thread类实现Runnable接口Callable接口线程池 前两种前面说过了, Runnable接口是比较常用的, 因为在Java中继承是很重要的, 不能随便使用, 但是Runnable接口有一个缺点, run()方法没有返回值, 也就是当线程结束时, 不能返回结果, 为了能返…

Java多线程 - Runnable接口和Callable接口的区别

文章目录 1. Runnable接口实例2. Callable接口原理3. Callnable接口实例4. FutureTask是什么&#xff1f;5. 线程池中 submit() 和 execute() 方法有什么区别&#xff1f; Runnable接口源码&#xff1a; FunctionalInterface public interface Runnable {// 这个run()方法返回值…

Callable 接口

Callable 接口 是 java.util.concurrent.下的一个泛型接口 , 只有一个call () 方法 , 它是有返回值的 , 我们可以获取多线程执行的结果 , 使用 Callable接口 和 FutureTask 的组合 , 可以实现利用 FutureTask 来跟踪异步计算的结果 获取多线程的方式 1. 继承 Thread 类 2. 实…