上机实验9 多线程案例

实验1 模拟抽奖

一、实验目的

了解多线程程序的设计思路

二、实验内容

有一个抽奖池,该抽奖池中存放了奖励的金额,该抽奖池用一个数组int[] arr = {10,5,20,50,100,200,500,800,2,80,300};创建两个抽奖箱(线程)设置线程名称分别为抽奖箱1”抽奖箱2”,随机从arr数组中获取奖项元素并打印在控制台上

三、程序代码

public class ChouJiang {
	public static void main(String[] args) {
		Chou c = new Chou();
		Thread t1 = new Thread(c,"抽奖箱1");//创建线程对象t1,命名为“抽奖箱1”
		Thread t2 = new Thread(c,"抽奖箱2");//创建线程对象t2,命名为“抽奖箱2”
			 t1.start();
			 t2.start();
      }
}
class Chou implements Runnable {
    int[] arr = { 10, 5, 20, 50, 100, 200, 500, 800, 2, 80, 300 };
    int num = arr.length;
    boolean[] flag = new boolean[arr.length];
    public void run() {
        while (true) {
            synchronized (this) {//设计一个同步锁
                if (num > 0) {
                    int index = (int)(Math.random()*arr.length);//产生数组的随机索引值
                    int get = arr[index];
                    // 代表这张抽奖券抽过了
                    if (flag[index] != true) {
                        flag[index] = true;
                        System.out.println(Thread.currentThread().getName()
                                + " 又产生了一个" + get + "元大奖");
                        num--;
                    }
                }
            }
        }
    }
}

四、实验指导

1、两个抽奖箱线程实现从抽奖池数组中抽取幸运数字

2、了解flag数组的含义,与抽奖池数组一一对应,判断该奖项是否抽出。

实验2 模拟订票

一、实验目的

掌握多线程程序的编写和线程同步的解决

二、实验内容

    某电影院目前正在上映贺岁大片,共有100张票,而它有3个售票窗口售票,请设计一个程序模拟该电影院售票。

两种方式实现

继承Thread类

实现Runnable接口

三、程序代码

public class BuyTicket {
	public static void main(String[] args) {//主函数
		SaleWindowThread w1 = new SaleWindowThread();
		Thread t1 = new Thread(w1, "第一个售票窗口");//模拟三个售票窗口
		Thread t2 = new Thread(w1, "第二个售票窗口");
		Thread t3 = new Thread(w1, "第三个售票窗口");
		t1.start();		//启动第一个售票窗口,开始售票
		t2.start();		//启动第二个售票窗口,开始售票
		t3.start();		//启动第三个售票窗口,开始售票
	}
}
class SaleWindowThread implements Runnable {	//实现Runnable接口
	private static int total_count = 100;		//电影票总数
	@Override
	public void run() { //重写run()方法
		while (true) {
			if (total_count > 0) {
				synchronized(this){
					if (total_count > 0){
						System.out.println(Thread.currentThread().getName() + "售出第" + (100 - total_count + 1) + "张票。还剩"+ (total_count - 1) + "张");	
						//记录售出票和剩余票数
				total_count--;
					}
				}
			} 
			else {
				break;
			}
		}
	}
}

四、实验指导

1、如果每次卖票延迟100毫秒,观察卖票信息是否正确

2、利用synchronized方法或代码块将共享资源封装,解决线程安全问题

实验3、打字练习

一、实验目的

掌握多线程和Timer类的使用

二、实验内容

通过GUI界面完成打字练习的功能

三、程序代码

import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class Writer {
	   public static void main(String args[]) {
		      WindowTyped win=new WindowTyped();
		      win.setTitle("打字练习");
		      win.setSleepTime(3000);
		   }
}
class WindowTyped extends JFrame implements ActionListener,Runnable {
	   JTextField inputLetter;
	   Thread giveLetter;       //负责给出字母
	   JLabel showLetter,showScore;
	   int sleepTime,score;
	   Color c;
	   WindowTyped() {
	      setLayout(new FlowLayout());
	      giveLetter=new Thread(this);
	      inputLetter=new JTextField(6);
	      showLetter =new JLabel(" ",JLabel.CENTER);
	      showScore  = new JLabel("分数:");
	      showLetter.setFont(new Font("Arial",Font.BOLD,22));
	      add(new JLabel("显示字母:"));
	      add(showLetter);
	      add(new JLabel("输入所显示的字母(回车)"));
	      add(inputLetter);
	      add(showScore);
	      inputLetter.addActionListener(this);
	      setBounds(100,100,400,280);
	      setVisible(true);
	      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	      giveLetter.start();    //在AWT-Windows线程中启动giveLetter线程
	   }
	   public void run() {
	      char c ='a';
	      while(true) {
	         showLetter.setText(""+c+" ");
	         validate();
	         c = (char)(c+1);
	         if(c>'z') c = 'a';
	         try{ Thread.sleep(sleepTime);
	         }
	         catch(InterruptedException e){}
	      }
	   }
	   public void setSleepTime(int n){
	      sleepTime = n;
	   }
	   public void actionPerformed(ActionEvent e) {
	      String s = showLetter.getText().trim();
	      String letter = inputLetter.getText().trim();
	      if(s.equals(letter)) {
	         score++;
	         showScore.setText("得分"+score);
	         inputLetter.setText(null);
	         validate();
	         giveLetter.interrupt();  //吵醒休眠的线程,以便加快出字母的速度
	      }
	   }
	}

四、实验指导

1、能够随机生成字符信息,对用户的操作有时间限制

2、有统计分数功能

实验4 月亮围绕地球

一、实验目的

学习使用Timer类创建线程

二、实验内容

编写一个应用程序,模拟月亮围绕地球

三、程序代码

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.Timer;

public class MainClass {
    public static void main(String args[]) {
    Sky sky= new Sky();
    JFrame frame = new JFrame();
    frame.add(sky);
    frame.setSize(500,500);
    frame.setVisible(true);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().setBackground(java.awt.Color.white);
  }}
class Earth extends JLabel implements ActionListener {
    	   JLabel moon;  //显示月亮之外观 
    	   Timer timer;
    	   double pointX[]=new double[360], 
    	          pointY[]=new double[360]; 
    	   int w=200,h=200,i=0;
    	   Earth() {
    	     setLayout(new FlowLayout());
    	     setPreferredSize(new Dimension(w,h));
    	     timer=new Timer(20,this);//创建timer,振铃间隔是20毫秒当前Earth对象为其监视器     
    	     setIcon(new ImageIcon("E:\\Java程序设计\\实验报告集合\\实验九\\earth.jpg"));
    	     setHorizontalAlignment(SwingConstants.CENTER);
    	     moon=new JLabel(new ImageIcon("E:\\Java程序设计\\实验报告集合\\实验九\\moon.jpg"),SwingConstants.CENTER);
    	     add(moon);
    	     moon.setPreferredSize(new Dimension(60,60));
    	     pointX[0]=0;                
    	     pointY[0]=h/2;
    	     double angle=1*Math.PI/180;   //刻度为1度  
    	     for(int i=0;i<359;i++) {      //计算出数组中各个元素的值 
    	       pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i];
    	       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);
    	     }
    	     for(int i=0;i<360;i++) {            
    	       pointX[i]=0.8*pointX[i]+w/2;    //坐标缩放、平移     
    	       pointY[i]=0.8*pointY[i]+h/2;
    	     }
    	     timer.start();
    	   }
    	   public void actionPerformed(ActionEvent e) {
    	       i=(i+1)%360;
    	       moon.setLocation((int)pointX[i]-30,(int)pointY[i]-30);
    	   }
    	}
class Sky extends JLabel implements ActionListener {
	   Earth earth;
	   Timer timer;
	   double pointX[]=new double[360], 
	          pointY[]=new double[360]; 
	   int w=400,h=400,i=0;
	   Sky() {
	     setLayout(new FlowLayout());
	     timer= new Timer(100,this);//创建timer,振铃间隔是100毫秒当前Sky对象为其监视器
	     setPreferredSize(new Dimension(w,h));
	     earth = new Earth();
	     add(earth);
	     earth.setPreferredSize(new Dimension(200,200));
	     pointX[0]=0;                
	     pointY[0]=h/2;
	     double angle=1*Math.PI/180;   //刻度为1度  
	     for(int i=0;i<359;i++) {      //计算出数组中各个元素的值 
	       pointX[i+1]=pointX[i]*Math.cos(angle)-Math.sin(angle)*pointY[i];
	       pointY[i+1]=pointY[i]*Math.cos(angle)+pointX[i]*Math.sin(angle);
	     }
	     for(int i=0;i<360;i++) {            
	       pointX[i]=0.5*pointX[i]+w/2;    //坐标缩放、平移
	       pointY[i]=0.5*pointY[i]+h/2;
	     }
	     timer.start();
	   }
	   public void actionPerformed(ActionEvent e) {
	       i=(i+1)%360;
	       earth.setLocation((int)pointX[i]-100,(int)pointY[i]-100);
	   }
}

地球图:  月亮图:

四、实验指导

如果一个圆的圆心是(0,0),那么对于给定的圆上的一点(x,y),该店按顺时针旋转a弧度后的坐标(m,n)有下列公式计算:

     m=x*cos(a)-y*sin(a);

     n=y*cos(a)+x*sin(a)。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
抽奖之星是一款简单好用的随机抽奖软件。软件可用于各种活动和晚会、年会抽奖,支持文字抽奖、图片抽奖等多种模式,还内置作弊内定、黑白名单、名单分组等诸多功能。软件界面美观简洁、使用方便,速度快,质量高,对于用户来说是一款很不错的软件,小编这里推荐大家使用这款软件! 抽奖之星基本简介 抽奖模式:含文字抽奖、照片抽奖两种模式。 重复中奖:采用禁止重复中奖算法,自动滤除已经中奖的参选者。 随机抽取:随机滚动显示参选者(姓名、号码、照片等)。 按键方便:按回车开始滚动,按空格停止滚动,按Tab键播放颁奖音乐。 名单导入:导入文本文件,或导入图片文件夹,最多可导入高达2万条。 抽奖结果:自动保存抽奖结果,不惧死机断电,支持缺席等的作废处理。 灵活易用:无需预先固定中奖数量,手动切换当前奖项,设置每次抽取个数(1-50)。 背景音乐:支持滚动音乐、中奖音乐、颁奖音乐,并附带了相关音乐资源。 辅助工具:附带了图片批量缩小、号码座位号批量生成、强大的纯文本编辑、多列表格数据导入导出、格式转换等免费工具。 抽奖之星的安装 把下载好的安装包解压到当前文件夹,之后双击【cjzx.exe】运行文件进行安装,打开的时候会出现安装框,依次开始安装,依照步骤点击下一步,并选择同意协议和软件安装位置即可。 抽奖之星的使用   安装完成后,点击【抽奖之星】快捷方式即可进入抽奖之星软件。如图所示,这是软件的主界面。     如图所示,这是软件的界面布局介绍。用户可以点击界面的各种按钮实现自己所需要的各种功能。     如图所示,这是软件的文字中奖名单模式。     如图所示,这是软件的文字图片名单模式。     如图所示,这是软件的播放总名单模式显示。软件的功能就大致介绍到这里了,软件其余的具体功能就有小伙伴们自己去发掘吧。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Meteor.792

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值