Java实验五——多线程实验

一、实验目的

1、练习多线程类的两种实现方法,理解多线程程序的生命周期。

二、实验内容

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

(1)一个线程进行阶乘和的运算(1!+2!+3!……+30!), 每次阶乘计算时间随机间隔0.5-1秒;
(2)另一个线程每隔1秒时间读取上个线程的运算结果和计算 进程,并在图形界面中实时显示结果。

三、实验要求

1、正确设计显示运行结果和计算进程的图形用户界面;
2、分别采用Thread类的子类和Runnable接口两种方式完成两个 线程的设计;
3、进行全面的测试并分析测试结果;
4、简要说明你在该实验中的收获与体会

四、实验设计

1、设计三个类ComputeThreadReturnThreadThreadFrame,分别实现计算进程,返回结果进程和界面设计。

ThreadFrame类代码实现

public class ThreadFrame implements ActionListener{
	JFrame frame;
	JPanel panel1,panel2,panel3,panel4,panel5;
	Container container;
	JTextField output,resultfield;
	JButton button;
	JLabel label1,label2,label3,label4;
	JProgressBar jprogressBar;
	public ThreadFrame(){
		frame = new JFrame("多线程实验界面");
		frame.setBounds(400, 100, 730, 500);
		container=frame.getContentPane();
		frame.setResizable(false);
		frame.addWindowListener(new WindowAdapter()
				{
					public void windowClosing(WindowEvent e) {
						System.exit(1);
					}
				});
		label1 = new JLabel("多线程实验");
		label1.setForeground(Color.red);
		label1.setFont(new Font("Dialog",1,50));
		label2 = new JLabel("计算线程");
		label2.setFont(new Font("Dialog",1,30));
		label3 = new JLabel("运算结果");
		label3.setFont(new Font("Dialog",1,30));
		label4 = new JLabel("计算进度");
		label4.setFont(new Font("Dialog",1,30));
		output = new JTextField();
		output.setPreferredSize(new Dimension(550,40));
		output.setFont(new Font("Dialog",1,20));
		resultfield = new JTextField();
		resultfield.setFont(new Font("Dialog",1,20));
		resultfield.setPreferredSize(new Dimension(550,40));
		panel1 = new JPanel();
		panel2 = new JPanel();
		panel3 = new JPanel();
		panel4 = new JPanel();
		panel5 = new JPanel();
		button = new JButton("开始计算");
		button.setFont(new Font("Dialog",1,30));
		button.setPreferredSize(new Dimension(200,60));
		button.addActionListener(this);
		jprogressBar = new JProgressBar(0,30);
		jprogressBar.setPreferredSize(new Dimension(550,20));
		panel1.add(label1);
		panel2.add(label2);
		panel2.add(output);
		panel3.add(label3);
		panel3.add(resultfield);
		panel4.add(label4);
		panel4.add(jprogressBar);
		panel5.add(button);
		container.setLayout(new GridLayout(5,1));
		container.add(panel1);
		container.add(panel2);
		container.add(panel3);
		container.add(panel4);
		container.add(panel5);
		frame.show();
		
	}
	//开始计算监听器
	public void actionPerformed(ActionEvent e)
	{
		ComputeThread computethread = new ComputeThread(this);
		Thread thread1 = new Thread (computethread);//实现runnable接口建立线程
		ReturnThread thread2 = new ReturnThread(this);//继承Thread类建立线程
		thread1.start();//启动线程
		thread2.start();//启动线程
				
	}
	public static void main(String[] args)
	{
		ThreadFrame test = new ThreadFrame();
	}
}

ComputeThread类实现

public class ComputeThread implements Runnable{
	ThreadFrame threadframe ;
	static public double result = 0;
	static public int i;
	String str1 = "";
	public ComputeThread(ThreadFrame t) {
		threadframe = t;
	}
	public void run() {
		long s=1;
		for(i=1;i<=30;i++)
		{
			if(str1.equals(""))
				{
					str1=i+"!";
				}
			else
				{
					str1 += "+" + i + "!";
				}
			s *=i;
			result +=s;
			threadframe.output.setText(str1);
			threadframe.jprogressBar.setValue(i);
			try {
				Thread.sleep((long)(500 + 500 * Math.random()));
			} catch (InterruptedException e) {
				
				e.printStackTrace();
				System.out.println("第1个线程休眠时出错!");
			}

		}
	}
}

ReturnThread类实现

public class ReturnThread extends Thread{
	ThreadFrame threadFrame;
	
	public ReturnThread(ThreadFrame threadFrame){
		this.threadFrame = threadFrame;
	}
	public void run() {
		while(ComputeThread.i != 30){
			threadFrame.resultfield.setText("" + ComputeThread.result);
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
				System.out.println("第2个线程休眠时出错!");
			}
		}
//这之后的代码确保显示的结果已经是最终结果
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
			System.out.println("第2个线程在最后一次休眠时出错!");
		}
		threadFrame.resultfield.setText("" + ComputeThread.result);
		ComputeThread.result = 0;//初始化结果
		ComputeThread.i = 1;//初始化i值
		threadFrame.button.setText("重新计算");//重设按钮文字
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值