Java基于线程的简单抽奖系统

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingConstants;

public class LotterySystem extends JFrame {
    String values[] = {"131****1234", "132****5678", "181****4869", "131****4932", "175****1900"}; // 预设的抽奖号码数组
    private final ThreadLocal<Thread> THREAD_LOCAL = new ThreadLocal<Thread>();// 存储当前线程中选中的号码
    private final String START = "开始", STOP = "停止";// 按钮文本常量
    private List<String> list;// 奖池,用于存储所有可以被抽中的号码
    private Random random = new Random();// 生成随机数
	private JLabel screen;// 显示当前抽中的号码的标签
   
    public LotterySystem() {
        setTitle("抽奖");//设置窗口标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(400, 400, 400, 200);//设置窗口位置、宽度和高度
        list = new ArrayList<>(Arrays.asList(values));//将号码放入奖池
        JPanel c = new JPanel();// 创建一个新的面板
        c.setLayout(new BorderLayout());// 设置面板布局为边界布局
        screen = new JLabel("请点击开始");// 创建一个标签,并设置初始文本
        screen.setHorizontalAlignment(SwingConstants.CENTER);// 设置文本居中显示
        screen.setFont(new Font("宋体", Font.PLAIN, 61));// 设置文本字体和大小
        c.add(screen, BorderLayout.CENTER);// 将标签添加到面板的中部位置
        JButton btn = new JButton(START);// 创建一个按钮,并设置文本为"开始"
        JPanel southPanel = new JPanel();// 创建一个新的面板
        southPanel.add(btn);// 将按钮添加到面板中
        c.add(southPanel, BorderLayout.SOUTH);// 将面板添加到窗口的下部位置
        setContentPane(c);// 将面板设置为窗口的内容面板
        // 按钮监听器
        btn.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String btnText = btn.getText();// 获取按钮文本
                if (START.equals(btnText)) {// 如果单击了开始按钮
                    if (list.size() == 0) {// 如果奖池没有名单了
                        screen.setText("谢谢参与");
                        btn.setVisible(false);// 隐藏按钮
                        JOptionPane.showMessageDialog(LotterySystem.this, "所有的号码都抽完了");// 弹出对话框
                    } else {
                        btn.setText("停止");
                        startDraw();
                    }
                } else if (STOP.equals(btnText)) {
                    stopDraw();
                    btn.setText("开始");
                }
            }
        });
    }
    // 开始抽奖
    private void startDraw() {
        Thread t = THREAD_LOCAL.get();// 从选中获取线程
        if (t == null) { // 如果线程是空
            t = new Thread() { // 创建新线程
                public void run() {
                    System.out.println("开始抽奖");
                    try {
                        while (true) {
                            if (interrupted()) {// 如果中断
                                throw new InterruptedException();
                            }
                            for (String tmp : values) {
                                screen.setText(tmp);
                            }
                        }
                    } catch (InterruptedException e) {
                        int winningIndex = random.nextInt(list.size());// 随机获取中奖者索引
                        screen.setText(list.remove(winningIndex));// 抽取中奖者,并显示在屏幕上
                        System.out.println("停止抽奖");
                    }
                }
            };
            THREAD_LOCAL.set(t);
        }
        t.start();
    }
    // 停止抽奖
    private void stopDraw() {
        Thread t = THREAD_LOCAL.get();
        if (t != null) {// 如果线程不为空
            if (!Thread.interrupted()) {
                t.interrupt();// 中断线程
            }
            THREAD_LOCAL.set(null);
        }
    }

    public static void main(String[] args) {
        LotterySystem frame = new LotterySystem();
        frame.setVisible(true);
    }

}

简单来说

这段代码是一个基于Java Swing实现的抽奖系统,主要功能是根据预设的号码数组values[],从中随机抽取一个号码,将其显示在GUI界面上。具体解释如下:

导入必要的Java AWT, Swing以及其他相关的类库。

import java.awt.BorderLayout;

import java.awt.Font;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Random;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.SwingConstants;

创建一个继承了JFrame的LotterySystem类,用于实现GUI操作。

定义了一个String类型的数组:values[],用来存储所有可以被抽中的号码。其中每个号码都被屏蔽了一部分数字,只显示前几位和后几位,保障了号码的私密性。

定义了一个ThreadLocal对象,用来存储当前线程中选中的号码。

定义了常量START和STOP,分别表示开始和停止状态下的按钮文本。

定义了一个List集合list,用于存储所有可以被抽中的号码。

定义了一个Random对象random,用于实现随机数的生成。

定义了一个JLabel对象screen,用于显示当前被抽中的号码。

实现了构造函数LotterySystem(),用于初始化整个界面。

创建了一个JPanel对象c,并将其设置为BorderLayout布局。这个对象包含两个部分:第一个部分是screen标签,用于显示当前抽中的号码;第二个部分是一个按钮,用于开始或停止抽奖。

创建了一个JButton对象btn,并将其文本设置为"开始"。同时,创建了一个新的JPanel对象southPanel,将btn对象添加到southPanel中,并将其设置为BorderLayout.SOUTH位置(即在界面的下方)。

将screen和southPanel添加到c中,并将整个c设置为JFrame的Content Pane。

实现了按钮监听器,用于对按钮的单击事件进行响应。如果当前状态是"开始",则判断奖池中是否还有号码,如果有则启动一个新的线程进行抽奖,否则提示游戏结束。如果当前状态是"停止",则停止当前线程。

实现了startDraw()方法,用于开始启动抽奖线程。随机生成一个获奖者的索引,从奖池中移除该号码,并将该号码显示在屏幕上。

实现了stopDraw()方法,用于停止当前抽奖线程。

实现了main()方法,用于启动整个程序。创建一个LotterySystem对象,并将其设置为可见状态。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是Java线程随机抽奖的一个例子: ```java import java.util.ArrayList; import java.util.List; import java.util.Random; public class LuckyDraw { private static final int SEAT_COUNT = 100; // 座位数 private static final int THREAD_COUNT = 10; // 线程数 private static final int DRAW_COUNT = 10; // 抽奖次数 private static List<Integer> seatList = new ArrayList<>(); // 座位号列表 private static List<Integer> luckyList = new ArrayList<>(); // 中奖号码列表 static { for (int i = 1; i <= SEAT_COUNT; i++) { seatList.add(i); } } public static void main(String[] args) { for (int i = 1; i <= THREAD_COUNT; i++) { new DrawThread("线程" + i).start(); } } static class DrawThread extends Thread { public DrawThread(String name) { super(name); } @Override public void run() { for (int i = 1; i <= DRAW_COUNT; i++) { synchronized (seatList) { int index = new Random().nextInt(seatList.size()); int seat = seatList.get(index); seatList.remove(index); System.out.println(this.getName() + "抽到了座位号:" + seat); synchronized (luckyList) { luckyList.add(seat); } } } } } } ``` 上述代码中,我们首先定义了座位数、线程数和抽奖次数等常量。然后在静态代码块中初始化了座位号列表。接着定义了一个内部类`DrawThread`,继承自`Thread`类,用于表示抽奖的线程。在`DrawThread`的`run`方法中,我们使用`synchronized`关键字对座位号列表进行同步,以避免多个线程抽到同一个座位号。具体来说,我们使用`Random`类生成一个随机数,然后从座位号列表中取出对应的座位号,并将其从列表中删除。接着,我们使用`synchronized`关键字对中奖号码列表进行同步,将抽到的座位号添加到中奖号码列表中。最后,我们在`main`方法中创建了10个`DrawThread`线程,并启动它们。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值