首页 > 技术文章 > JAVA入门 多线程实验

zqiuliu 2021-06-01 20:53 原文

JAVA入门 多线程实验

实验目的

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

实验内容

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

要求
1.分别采用Thread类和Runnable接口两种方式完成线程的设计
2.正确显示运行结果和计算进程的图形用户界面

这里我的两个线程均没有写异常处理机制,可自行添加

JAVA代码

package javaproject;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

class ThreadFrame implements ActionListener
{
	JFrame jframe;
	Container container;
	JPanel jpanel1,jpanel2,jpanel3,jpanel4,jpanel5;//五个面板
	Label title;Label l1;Label l2;Label l3;
	JTextField j1;
	JTextField j2;
	JButton jButton;
	JProgressBar jProgressBar;
	
	/***初始化***/
	public ThreadFrame()
	{
		jframe=new JFrame("多线程实验");
		jframe.setBounds(400, 100, 400, 250);
		jframe.setResizable(false);
		container=jframe.getContentPane();
		jframe.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we){
				System.exit(0);}
		});
		
		
		/**组件初始化****/
		jProgressBar=new JProgressBar(0,30);jProgressBar.setPreferredSize(new Dimension(280,20));
		j1=new JTextField(25);j2=new JTextField(25);
		jpanel1=new JPanel();jpanel2=new JPanel();jpanel3=new JPanel();jpanel4=new JPanel();jpanel5=new JPanel();
		jButton=new JButton("开始计算");
		title=new Label("多线程实验");
		Font font = new Font("仿宋", Font.PLAIN, 30);title.setFont(font);title.setForeground(Color.blue);
		l1=new Label("计算线程");l2=new Label("读取线程");l3=new Label("计算进度");
		
		
		/***添加组件到容器***/
		container.setLayout(new GridLayout(5,1));
		jpanel1.add(title);jframe.add(jpanel1);
		jpanel2.add(l1); jpanel2.add(j1); jframe.add(jpanel2);
		jpanel3.add(l2); jpanel3.add(j2); jframe.add(jpanel3);
		jpanel5.add(jButton);
		jpanel4.add(l3); jpanel4.add(jProgressBar);jframe.add(jpanel4);jframe.add(jpanel5);
		jframe.setVisible(true);
		
		/****加入监听事件并注册监听器****/
		jButton.addActionListener(this);
		
	}
		public void actionPerformed(ActionEvent e) 
		{
			/**Runnable接口**/
			ComputeThread x=new ComputeThread(this);
			Thread x1=new Thread(x);
			x1.start();
			/**Thread类扩展**/
			ReturnThread x2=new ReturnThread(this);
			x2.start();
		}
		
}

class ComputeThread implements Runnable{//一个线程进行阶乘和的运算
	ThreadFrame threadframe;
	public ComputeThread(ThreadFrame threadframe) 
	{
		this.threadframe=threadframe;
	}
	static double sum1=0;//阶乘和
	static int i;//进度
	static String sum="";//阶乘和1!+2!+3!+....+30!字符串
	static String Result="";//阶乘结果字符串
	
	double jiecheng(int m)//阶乘计算函数
	{
		double result=1;
		for(int i=1;i<=m;i++)
		{
			result*=i;
		}
		return result;
	}
	public void run()
	{
		for(i=1;i<=30;i++)
		{
			/**阶乘和显示***/
			if(sum.equals(""))
			{
				sum=i+"!";
			}
			else
			{
				sum+="+"+i+"!";
			}
			sum1+=jiecheng(i);
			Result=String.valueOf(sum1);
			/*threadframe.j2.setText(Result);
			  threadframe.j1.setText(sum);
              threadframe.jProgressBar.setValue(i);*/
			
            //异常处理
            try{
            	Thread.sleep((long)(500 + 500 * Math.random()));
            	}catch (InterruptedException e) {}
	    }
    }
}

class ReturnThread extends Thread//一个线程每隔1秒时间读取上个线程的运算结果和计算进程,并在图形界面中实时显示结果
{
	
	ThreadFrame threadFrame;
	public ReturnThread(ThreadFrame threadFrame) 
	{
		this.threadFrame=threadFrame;
	}
	public void run()
	{
		while(ComputeThread.i<=30)
		{
			threadFrame.jProgressBar.setValue(ComputeThread.i);//进度条显示进度
			threadFrame.j2.setText(ComputeThread.Result);//显示阶乘计算结果
			threadFrame.j1.setText(ComputeThread.sum);//显示各个阶乘计算和
			try{
				Thread.sleep(100);
			}catch (InterruptedException e){	
			}
			
		}
		
		ComputeThread.sum1=0;//计算阶乘的结果 Reuslt将sum1转化为字符串
		ComputeThread.sum="";//显示1!+2!+····+30!的阶乘
		ComputeThread.i=1;//进度条
		threadFrame.jButton.setText("重新计算");//计算完设置重新计算按钮
	}
}

/***主main类***/
public class xiancheng
{
	public static void main(String args[])
	{
		ThreadFrame t=new ThreadFrame();
	}
}

推荐阅读