Java実験5——マルチスレッド実験

31661 ワード

一、実験目的
1、マルチスレッドクラスの2つの実現方法を練習し、マルチスレッドプログラムのライフサイクルを理解する.
二、実験内容
        ,      : 

(1)1つのスレッドが乗算を行い(1!+2!+3!……+30!)、各乗算時間がランダムに0.5~1秒間隔である;(2)別のスレッドが1秒間隔で前のスレッドの演算結果と計算プロセスを読み出し、グラフィックインタフェースに結果をリアルタイムで表示する.
三、実験要求
1、運行結果と計算プロセスを表示するグラフィックユーザーインタフェースを正しく設計する.2、ThreadクラスのサブクラスとRunnableインタフェースの2つの方式を採用して2つのスレッドの設計を完成する.3、全面的なテストを行い、テスト結果を分析する.4、あなたのこの実験での収穫と体得を簡単に説明します.
四、実験設計
1、3つのクラスComputeThread、ReturnThread、ThreadFrameを設計し、それぞれ計算プロセスを実現し、結果プロセスとインタフェース設計を返す.
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("    ");//      
	}
}