我是靠谱客的博主 多情外套,最近开发中收集的这篇文章主要介绍多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,一个售票窗口用一个线程表示。要求不能重复发售。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

五一假期要到了,希望大家都都能开开心心
代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Test9_2 extends JFrame implements ActionListener
{
//    多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,
//
//    一个售票窗口用一个线程表示。要求不能重复发售。

    public Button b_start=new Button("开始售卖");
    public s_panel s1=new s_panel(50,100,1,25);
    public s_panel s2=new s_panel(50,200,26,50);
    public s_panel s3=new s_panel(50,300,51,75);
    public s_panel s4=new s_panel(50,400,76,100);
    public static int id=1;
    public Test9_2()//构造方法
    {
        super("五一黄金周机票售卖");
        setBounds(100,100,700,550);

        add(b_start);
        b_start.addActionListener( this);
        b_start.setBounds(20,50,70,20);
        add(s2);
        add(s1);
        add(s3);
        add(s4);
        setLayout(null);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args)
    {
        new Test9_2();
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        b_start.setEnabled(false);
        ExecutorService exec= Executors.newCachedThreadPool();
        exec.execute(s1);
        exec.execute(s2);
        exec.execute(s3);
        exec.execute(s4);

        exec.shutdown();
    }
}

class s_panel extends JPanel implements Runnable
{
    protected int x,y;
    protected int max;
    protected int min;
    protected JLabel s_Label=new JLabel("售票窗口"+Test9_2.id+++"已售出票号:");
    protected JTextField s_TextField=new JTextField(40);
    protected int[] nums =new int[100];
    //protected int[] nums =new int[25];错误示例
    public s_panel(int x,int y,int min,int max)
    {
        this.x=x;
        this.y=y;
        this.max=max;
        this.min=min;
        setBounds(x,y,500,100);
        add(s_Label);
        add(s_TextField);
        s_TextField.setEditable(false);
    }
    @Override
    public void run()
    {
        try
        {
            for(int i=min;i<=max;)
            {

                int flag=1;
                int num=(int)(Math.random()*max+1);
                //int num=(int)(Math.random()*max+1)-min+1;错误示例
                //JOptionPane.showMessageDialog(null,num);
                for(int j=min;j<=i;j++)//判断num是否符合条件
                {
                    if (num == nums[j - 1] || num < min || num > max)
                    {
                        flag = 0;
                        break;
                    }

                }
                if(flag==1)
                {
                    //JOptionPane.showMessageDialog(null,num);
                    nums[i-1]=num;
                    String temp=s_TextField.getText();
                    s_TextField.setText(temp+" "+num);
                    TimeUnit.MILLISECONDS.sleep(100);
                    i++;
                }

            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
}

遇到的问题:

  1. 困扰我最久的,还是最开始的越界问题,数组越界,刚开始学的时候也是数组越界,现在也是数组越界问题,什么时候才能像wg一样有严谨的数学逻辑思维啊,最开始只有线程1有输出,2,3,4,全都莫得,当时人都鲨了,疯狂debug,死活找不到,结果mm过来指点迷津,令人茅塞顿开,才发现我灯下黑,每次窗口弹出来,都把底下的控制台挡住了,控制台疯狂报错告诉我数组越界,我没看,越界的位置在唯一的一个数组nums那,我最开始设置的大小是25,因为我比较懒就弄了个简单点的,让s1卖1-25,然后依次类推到100,然后为了消除重复元素,就又搞了个数组去做参照,当时想的是数组长度25刚好,但是后来才发现,我的数组指针i和传入的参数max,min有关系,除了s1的max=25,不会越界,其他的三组都会越界,所以莫得显示
  2. 本来一位数组越界解决完就不会有问题了,但是还是莫得输出,又查了一下,运气好直接找到了int
    num=(int)(Math.random()*max+1)-min+1;这个地方呢,是因为-min,所以导致num永远在1-25之间,所以s2,3,4自然不可能有输出,差不多就是这个样子了

谨以此篇博客纪念mm深夜学习给zm带来的鼓励

最后

以上就是多情外套为你收集整理的多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,一个售票窗口用一个线程表示。要求不能重复发售。的全部内容,希望文章能够帮你解决多线程试验。模拟航班售票系统,实现4个售票窗口发售某班次航班的100张机票,一个售票窗口用一个线程表示。要求不能重复发售。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部