0
点赞
收藏
分享

微信扫一扫

Java练习:实验九(异常与多线程)

sullay 2022-01-08 阅读 66

1.编写一个程序,在其中写一个随机数发生类,它能生成0-100之间的随机整数,在主方法中使用随机数发生类对象生成一些随机数,要求当生成的随机数大于60时定义一个用户定义异常类对象并抛出该对象。

package javaExp9;

import java.util.Random;

public class RandomCatch {
	int RandomNum;
	public RandomCatch() {
		RandomNum=new Random().nextInt(100);
	}
	
	public static void main(String[] args) throws NumException{
		RandomCatch randomNumCatch=new RandomCatch();
		System.out.println("随机数:"+randomNumCatch.RandomNum);
		if(randomNumCatch.RandomNum>60)
			throw new NumException();
	}
}
class NumException extends ArithmeticException{
	public NumException(){System.out.println("数字>60!");}
}

2.编写一个多线程程序,在其中实现两个定时线程,一个线程每隔1秒显示一次秒数,另一个每隔3秒显示一次字母(a,b,…)。

package javaExp9;
import java.util.Date;

public class IntervalDisplay extends Thread{
	int intervalTime;
	String displayStr;
	public IntervalDisplay(int interTime,String str) {
		intervalTime=interTime;
		displayStr=str;
	}
	public void run() {
		if(displayStr=="Time")
		{	while(true)
			{
				try {
					System.out.println("Current second:"+new Date().getSeconds()+"s");
					Thread.sleep(intervalTime);
				} catch (Exception e) {
					System.out.println(e);
				}
			}
		}
		else if (displayStr=="Char") {
			try {
					for(int i=0;i<=25;i++)
					{
						System.out.println("Current Char:"+(char)(i+97));
						Thread.sleep(intervalTime);	
					}
				} catch (Exception e) {
					System.out.println(e);
				}
			}
		}
		
	
	
	public static void main(String[] args)
	{
		IntervalDisplay ThreadTime=new IntervalDisplay(1000, "Time");
		IntervalDisplay ThreadChar=new IntervalDisplay(3000, "Char");
		ThreadChar.start();
		ThreadTime.start();
	}
}

在这里插入图片描述
另外,关于线程优先级:

  • 线程可以划分优先级,优先级高的线程得到的CPU资源比较多,也就是CPU优先执行优先级高的线程对象中的任务。
  • 设置线程优先级有助于帮助线程规划器确定下一次选中哪一个线程优先执行。
  • 只有Thread类有setPriority()

4.编写一个JFrame窗体宽300,高100,布局管理器为null,窗体上有一个标签和一个按钮,标签的位置是(10,20),按钮的位置是(100,60),它们的宽度和高度都是80和20。 再编写一个线程,该线程可以让标签向右移动10次,每次移动10个单位,间隔1秒,通过按钮的动作事件启动上述线程。 界面如下图所示。
在这里插入图片描述

package javaExp9;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import java.awt.event.*;
 class LabelMove extends JFrame implements ActionListener{

	JButton Activate;
	JLabel MoveLabel;
	public LabelMove() {
		Activate=new JButton("启动");
		MoveLabel=new JLabel("向右移标签");
		setLayout(null);
		add(Activate);
		add(MoveLabel);
		Activate.setBounds(100,60,80,20);
		MoveLabel.setBounds(10,20,80,20);
		Activate.addActionListener(this);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		System.out.println("Thread Activate!");
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				for(int i=0;i<10;i++)
				{
				try {
					MoveLabel.setLocation(10+i*10,20);
					Thread.sleep(1000);
					} 
				catch (Exception e2) {
					System.out.println("Fail!");
					}
				}	
			}
		}).start();
	}
	public static void main(String[] args) {
		LabelMove sample=new LabelMove();
		sample.setSize(300,200);
		sample.show();
		
	}
}

这里采用了匿名内部类的方法,虽说完成了题目,但是我对于使用线程更新UI的方法并没有一个明确的概念,这里暂且放置,放假后再研究。

5.编写一个图形用户界面程序,窗体的宽度300,高度150,布局管理器为null,窗体上有二个标签和二个按钮,标签的位置为(10,30)和(200,60),按钮的位置为(50,100)和(150,100),它们的宽度和高度都是80和20。编写一个线程,该线程可以让标签向右或向左移动10次,每次移动10个单位,间隔1秒,通过按钮的动作事件启动上述线程,“向右走”按钮启动“向右移标签”,“向左走”按钮启动“向左移标签”,界面如下图所示。

package javaExp9;
import java.awt.event.*;
import javax.swing.*;
public class MultiThreadFrameMovement extends JFrame implements ActionListener{
	JButton btn_Left;
	JButton btn_Right;
	JLabel label_Left;
	JLabel label_right;
	
	public MultiThreadFrameMovement() {
		btn_Left=new JButton("向左走");
		btn_Right=new JButton("向右走");
		label_Left=new JLabel("向左移标签");
		label_right=new JLabel("向右移标签");
		setLayout(null);
		add(btn_Left);
		add(btn_Right);
		add(label_Left);
		add(label_right);
		
		btn_Left.setBounds(50,100,80,20);
		btn_Right.setBounds(150,100,80,20);
		label_Left.setBounds(200,60,80,20);
		label_right.setBounds(10,30,80,20);
		btn_Left.addActionListener(this);
		btn_Right.addActionListener(this);
		
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		new Thread (new Runnable() {
			@Override
			public void run() {
				if(e.getSource()==btn_Left)
				{
					for(int i=0;i<10;i++)
					{
						try {
							label_Left.setLocation(200-i*10,60);
							Thread.sleep(1000);
							} 
						catch (Exception e2) {
							System.out.println("LeftMove Fail!");
							}
					}		
				}
				else if(e.getSource()==btn_Right)
				{
					for(int i=0;i<10;i++)
					{
						try {
							label_right.setLocation(10+i*10,30);
							Thread.sleep(1000);
							} 
						catch (Exception e2) {
							System.out.println("RightMove Fail!");
							}
					}		
				}
			}
		}).start();
		
	}
	public static void main(String[] args)
	{
		MultiThreadFrameMovement sample=new MultiThreadFrameMovement();
		sample.setSize(300,175);
		sample.show();
	}

}

举报

相关推荐

0 条评论