java 多线程

本文介绍了一个使用Java实现的多线程程序,该程序包含两个核心线程:一个负责计算从1到12的阶乘之和,并在每次计算阶乘时引入随机延迟;另一个线程则负责每秒更新GUI界面上的计算进度和当前结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Written by Robert_Wang in Southwest University of Science And Technology.

编写一多线程程序,实现如下功能:

(1)一个线程进行阶乘和的运算(1!+2!+3!+……+12!),每次阶乘计算时间随机间隔0.5-1秒;

(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算进程,并在图形界面中实时显示结果。

首先想到写三个类,功能分别是:显示、计算、传数据

显示:新建一个applicationwindow,建立一个包括计算过程、计算结果、进度条

还应该有一个开始执行的按钮。

计算:计算阶乘和,这里应该可以采用两个变量优化算法,具体看后面。

传数据:就是将计算的结果放入文本区域显示。

布局(Abusolutelayout) (就是容器、组件任意放)àJLabel (放标签) àJTextArea(文本区域)àJProgressBar(进度条)

计算:

计算的核心就是得到快速得到计算结果,这里我采用的用两个变量,一个将上一次的计算结果记住,一个累加。这样避免了每一次重复加。

传数据:传入计算和显示两个类,将计算结果传入显示的类的文本框,并设置是每隔1秒显示一次,还有进度条设置为计算的进度。


ThreadCompute:

package test6;

public class ThreadCompute extends Thread{
	protected String textsum;
	protected String textsum1;
	protected static int i;
	protected static int sum;
	protected static int sum1;
	public void method() {
		i= sum = 1;
		sum1=0;
		
		while(i<=12)
		{
			//记录上次计算的结果
			sum*=i;
			//记录累加的结果
			sum1+=sum;
			textsum1 = String.valueOf(sum1);
			if(i == 1) {
				textsum = i + "!";
			}
			else textsum+="+"+i+"!";
			i++;
			//每个0.5 - 1.0 ms 计算一次
			try {
				this.sleep((long)(Math.random()*500+500));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
//		super.run();
		method();
	}
}

ThreadRead:

package test6;

public class ThreadRead implements Runnable {

	public ThreadCompute tc;
	public ThreadFrame tf;
	
	public ThreadRead(ThreadCompute tc, ThreadFrame tf) {
		super();
		this.tc = tc;
		this.tf = tf;
	}
	public void show() {
		
		while(true) {
			tf.textField.setText(tc.textsum);
			tf.textField_1.setText(tc.textsum1);
			
			//每隔1秒显示一次
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			tf.progressBar.setValue(tc.i);
		}
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		show();
	}

}

ThreadFrame:

package test6;

import java.awt.EventQueue;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.JProgressBar;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class ThreadFrame {

	protected JFrame frame;
	protected JTextField textField;
	protected JTextField textField_1;
	protected static ThreadFrame window;
	protected JProgressBar progressBar;
	protected int c=0;
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					 window = new ThreadFrame();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public ThreadFrame() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		frame = new JFrame();
		frame.setBounds(100, 100, 450, 300);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().setLayout(null);
		
		JLabel label = new JLabel("\u8BA1\u7B97\u8FC7\u7A0B");
		label.setBounds(14, 26, 72, 18);
		frame.getContentPane().add(label);
		
		textField = new JTextField();
		textField.setEditable(false);
		textField.setBounds(100, 23, 260, 24);
		frame.getContentPane().add(textField);
		textField.setColumns(10);
		
		JButton button = new JButton("\u5F00\u59CB\u6267\u884C");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				c++;
				if(c ==1 ) {
					ThreadCompute tc = new ThreadCompute();
					//这个类只是实现了一个接口,
					ThreadRead tr = new ThreadRead(tc, window);
					Thread t = new Thread(tr);
					tc.start();
					t.start();	
				}
				
			}
		});
		button.setBounds(151, 188, 113, 27);
		frame.getContentPane().add(button);
		
	    progressBar = new JProgressBar();
		progressBar.setBounds(100, 143, 260, 32);
		progressBar.setMaximum(12);
		frame.getContentPane().add(progressBar);
		
		JLabel label_1 = new JLabel("\u8BA1\u7B97\u7ED3\u679C");
		label_1.setBounds(14, 87, 72, 18);
		frame.getContentPane().add(label_1);
		
		textField_1 = new JTextField();
		textField_1.setEditable(false);
		textField_1.setBounds(100, 84, 260, 24);
		frame.getContentPane().add(textField_1);
		textField_1.setColumns(10);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江湖无为

感谢你们的鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值