java学习之多线程(一)——抽奖机

1、程序:也就是通常我们所说的软件,如:QQ,迅雷,酷狗等等,它是指一组指示计算机或其他具有信息处理能力装置执行动作或做出判断的指令。

2、进程:就是正在运行的应用程序。进程是系统进行资源分配和调用的独立单位。

3、线程:进程的执行单元、执行路径。在同一个进程内可以执行多个任务,而这每一个任务就可以看作是一个线程。线程是程序使用CPU的最基本单位。
    单线程程序:程序只有一条执行路径,代码按照调用顺序依次往下执行。
    多线程:程序有多条执行路径,多段程序代码交替运行。

4、线程的两种创建方式:

    a.继承Thread类;

    b.实现Runnable接口;

事实上,Java源码推荐使用第二种方式来创建多线程,即实现Runnable接口,原因有:

  • 避免由于Java的单继承带来的局限性;
  • 适合多个相同程序代码的线程去处理同一个资源的情况,把线程同程序代码、数据有效的分离(如多窗口销售火车票)。

5、线程的生命周期:

  a.新建状态(new);

  b.就绪状态(Runnable);

  c.运行状态(Running);

  d.阻塞状态(Blocked);

  e.死亡状态(Terminated);

6、多线程之抽奖机的实现:

  功能实现:

  a.创建一个多线程控制人员名单滚动;

  b.已中奖人员不再参与抽奖;

  c.通过读取excel表格获取抽奖人员名单。

效果图:

代码实现:

主界面设计:


package com.Liao.Lottery0710v3;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Lottery extends JFrame {
	private static final long serialVersionUID = 1L;

	// 主函数
	public static void main(String[] args) {
		new Lottery().initUI();
	}

	public void initUI() {
		this.setTitle("抽奖程序");
		this.setSize(550, 200);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setLayout(new FlowLayout(200));

		// 添加按钮
		JButton jbu1 = new JButton();
		jbu1.setPreferredSize(new Dimension(300, 180));
		this.add(jbu1);
		// 添加标签,并设置字体
		JLabel jl1 = new JLabel("    开始抽奖");
		jl1.setFont(new Font("楷体", Font.BOLD, 30));
		jbu1.add(jl1);

		JLabel jl2 = new JLabel("获奖人员");
		jl2.setFont(new Font("黑体", Font.BOLD, 50));
		this.add(jl2);
		// 创建监听器对象
		LotteryListener cl = new LotteryListener(jl2, jl1);
		// 给按钮注册监听器
		jbu1.addActionListener(cl);
		this.setVisible(true);
	}
}

读取表格,获取参与人员名单,需要注意的是,这里需要导入第三方包java.jxl用以读取表格,另外表格文件也是采用相对位置:

package com.Liao.Lottery0710v3;

import java.io.File;
import java.util.LinkedList;
import jxl.Sheet;
import jxl.Workbook;

public class ReadExcel {
	private Workbook book;
	private Sheet sheet;
	private LinkedList<String> list=new LinkedList<>();

	public LinkedList<String> getName() {
		System.out.println("读取文件");
		try {
			// 打开文件
			book = Workbook.getWorkbook(new File("抽奖名单.xls"));
			// 获得第一个工作表对象(excel中sheet的编号从0开始,0,1,2,3,....)
			sheet = book.getSheet(0);
			for (int i = 0; i < 100; i++) {
				//判断第一列元素是否为空
				if (sheet.getCell(0, i).getContents() != "") {
					//将单元格内容保存到链表中
					list.add(sheet.getCell(0, i).getContents());
				}
			}
			//关闭文件
			book.close();
		} catch (Exception e) {
		}
		return list;
	}
}

监听器:


package com.Liao.Lottery0710v3;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class Lottery extends JFrame {
	private static final long serialVersionUID = 1L;

	// 主函数
	public static void main(String[] args) {
		new Lottery().initUI();
	}

	public void initUI() {
		this.setTitle("抽奖程序");
		this.setSize(550, 200);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setLayout(new FlowLayout(200));

		// 添加按钮
		JButton jbu1 = new JButton();
		jbu1.setPreferredSize(new Dimension(300, 180));
		this.add(jbu1);
		// 添加标签,并设置字体
		JLabel jl1 = new JLabel("    开始抽奖");
		jl1.setFont(new Font("楷体", Font.BOLD, 30));
		jbu1.add(jl1);

		JLabel jl2 = new JLabel("获奖人员");
		jl2.setFont(new Font("黑体", Font.BOLD, 50));
		this.add(jl2);
		// 创建监听器对象
		LotteryListener cl = new LotteryListener(jl2, jl1);
		// 给按钮注册监听器
		jbu1.addActionListener(cl);
		this.setVisible(true);
	}
}

抽奖线程:

package com.Liao.Lottery0710v3;

import java.util.LinkedList;
import java.util.Random;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class RandThread extends Thread {
	private JLabel jl2;
	private LinkedList<String> list;
	private String name;
	// 暂停标志
	public volatile Boolean ispaused = false;

	public RandThread() {
	}

	public RandThread(JLabel jl2, LinkedList<String> list) {
		this.jl2 = jl2;
		this.list = list;
	}

	public void run() {
		while (true) {
			if (!list.isEmpty()) {
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				while (ispaused) {
					// 创建一个随机数(0,人员个数)
					Random rand = new Random();
					int n = rand.nextInt(list.size());
					// 显示获奖人员名字
					name = list.get(n);
					jl2.setText(name);
				}
				list.remove(name);
			}else{
				JOptionPane.showMessageDialog(new JOptionPane(), "抽奖名单为空");
				return;
			}
		}
	}
}

  这样一个简单实用的抽奖程序就实现了!当然,感兴趣的朋友还能增加一些特效,如界面优化,背景音乐等等。

猜你喜欢

转载自blog.csdn.net/LIAO_7053/article/details/81075761