java 利用多线程实现彩票模拟程序

mmmm0303 2020-05-13 11:25:55
说明:可以设置一个特殊的彩票号作为彩票发放结束标志,main线程等所有彩票发放结束后,公布一个中奖号,并公布每个线程取到的所有彩票和中奖的线程!
...全文
1573 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
爲你下場雨 2020-05-19
  • 打赏
  • 举报
回复
牛X了,学到 我也做一个
复杂化学 2020-05-18
  • 打赏
  • 举报
回复
打捞到老哈哈哈哈哈
tcdgz 2020-05-16
  • 打赏
  • 举报
回复
非常好,很实用的程序
qq_35539582 2020-05-16
  • 打赏
  • 举报
回复
这个不错。。可以自己做个程序;
qq_43305018 2020-05-16
  • 打赏
  • 举报
回复
很好的帖子,非常实用
  • 打赏
  • 举报
回复
引用 28 楼 mmmm0303 的回复:
刚开始学这个线程嘛 还不是特别了解

public static void main(String[] args) {
        String zhongjiang = "99";
        BlockingQueue<String> queue = new ArrayBlockingQueue<String>(100);
        Thread producer = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    try {
                        String s =new Random().nextInt(100)+"";
                        queue.put(s);
                        System.out.println(Thread.currentThread().getName()+":"+s);
                        if (s.equalsIgnoreCase(zhongjiang)){
                            System.out.println(String.format("中奖号码[%s]已出,%s停止",zhongjiang,Thread.currentThread().getName()));
                            break;
                        }
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        TimeUnit.MILLISECONDS.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        producer.setName("生产者线程");
        producer.start();
        for (int i = 0; i < 4; i++){
            Thread consumer = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true){
                        try {
                            String s = queue.take();
                            System.out.println(Thread.currentThread().getName()+":"+s);
                            if (s.equalsIgnoreCase(zhongjiang)){
                                System.out.println(String.format("%s已中奖,中奖号码[%s]",Thread.currentThread().getName(),zhongjiang));
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        try {
                            TimeUnit.MILLISECONDS.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            consumer.setName("消费者线程"+i);
            consumer.start();
        }
    }

生产者线程:91
消费者线程0:91
生产者线程:30
消费者线程1:30
生产者线程:65
消费者线程2:65
生产者线程:30
消费者线程3:30
生产者线程:77
消费者线程0:77
生产者线程:73
消费者线程1:73
生产者线程:18
消费者线程2:18
生产者线程:92
消费者线程3:92
生产者线程:42
消费者线程0:42
生产者线程:47
消费者线程1:47
生产者线程:1
消费者线程2:1
生产者线程:43
消费者线程3:43
生产者线程:19
消费者线程0:19
生产者线程:40
消费者线程1:40
生产者线程:96
消费者线程2:96
生产者线程:56
消费者线程3:56
生产者线程:38
消费者线程0:38
生产者线程:38
消费者线程1:38
生产者线程:48
消费者线程2:48
生产者线程:75
消费者线程3:75
生产者线程:27
消费者线程0:27
生产者线程:0
消费者线程1:0
生产者线程:35
消费者线程2:35
生产者线程:71
消费者线程3:71
生产者线程:6
消费者线程0:6
生产者线程:47
消费者线程1:47
生产者线程:54
消费者线程2:54
生产者线程:13
消费者线程3:13
生产者线程:74
消费者线程0:74
生产者线程:65
消费者线程1:65
生产者线程:49
消费者线程2:49
生产者线程:99
消费者线程3:99
中奖号码[99]已出,生产者线程停止
消费者线程3已中奖,中奖号码[99]
  • 打赏
  • 举报
回复
java是不是可以减轻内存啊
qq_40200731 2020-05-15
  • 打赏
  • 举报
回复
有没有代码贴一下呢 刚开始学多线程还不怎么会
famom 2020-05-15
  • 打赏
  • 举报
回复
楼上大佬666
hhffww2 2020-05-15
  • 打赏
  • 举报
回复
https://bbs.csdn.net/
安迪的海滩 2020-05-14
  • 打赏
  • 举报
回复
没有值了,那我岂不是执行到finally了
  • 打赏
  • 举报
回复
为了分,拼了

public static void main(String[] args) {
        BlockingQueue<String> queue = new ArrayBlockingQueue<String>(100);
        Thread producer = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    try {
                        String s =new Random().nextInt(100)+"";
                        queue.put(s);
                        System.out.println(Thread.currentThread().getName()+":"+s);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    try {
                        TimeUnit.MILLISECONDS.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        producer.setName("生产者线程");
        producer.start();
        for (int i = 0; i < 4; i++){
            Thread consumer = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true){
                        try {
                            String s = queue.take();
                            System.out.println(Thread.currentThread().getName()+":"+s);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        try {
                            TimeUnit.MILLISECONDS.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            consumer.setName("消费者线程"+i);
            consumer.start();
        }
    }
SXM811 2020-05-14
  • 打赏
  • 举报
回复
好好好好好好
  • 打赏
  • 举报
回复
把你的list改成concurent包下的线程安全队列,不需要自己做线程同步之类的。
引用 9 楼 mmmm0303 的回复:
import java.util.LinkedList; import java.util.Random; public class Thread2 { public static void main(String[] args) throws InterruptedException { LinkedList<Integer> list = new LinkedList<>(); Producer p = new Producer(list,10); Consumer c1 = new Consumer(list); Consumer c2 = new Consumer(list); Consumer c3 = new Consumer(list); Consumer c4 = new Consumer(list); Thread producer = new Thread(p); producer.setName("生产者线程"); Thread consumer1 = new Thread(c1); consumer1.setName("消费者1"); Thread consumer2 = new Thread(c2); consumer2.setName("消费者2"); Thread consumer3 = new Thread(c3); consumer3.setName("消费者3"); Thread consumer4 = new Thread(c4); consumer4.setName("消费者4"); producer.start(); consumer1.start(); consumer2.start(); consumer3.start(); consumer4.start(); } } class Producer implements Runnable { private final LinkedList<Integer> list; private final int maxSize; public Producer(LinkedList list, int i) { maxSize = i; this.list = list; } @Override public void run() { try { while(true) { //模拟耗时1s Thread.sleep(1000); synchronized (list) { if(list.size()==maxSize) { list.wait(); } else { list.add(produce()); list.notifyAll(); } } } } catch (InterruptedException e) { e.printStackTrace(); } } private int produce() { int n = new Random().nextInt(100); System.out.println( Thread.currentThread().getName() + " produce: " + n); return n; } } class Consumer implements Runnable { private final LinkedList<Integer> list; public Consumer(LinkedList list) { this.list = list; } @Override public void run() { while (true) { try { synchronized(list) { //模拟耗时 Thread.sleep(1000); if(list.isEmpty()) { list.wait(); } else { consume(list.poll()); list.notifyAll(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } private void consume(Integer n) { System.out.println(Thread.currentThread().getName() + " consume: " + n); } } 兄弟们可以看看我这个代码怎么修改吗 我允许的结果不对 我想要的运行结果应该是 四个消费者各取得一个号码 然后我再判断谁中奖的 但现在为什么后面一直是消费者1 在消费
  • 打赏
  • 举报
回复
引用 15 楼 dkwuxiang 的回复:
[quote=引用 8 楼 混口饭吃的程序员 的回复:] @Slf4j public class Test { public static void main(String[] args) throws InterruptedException { BlockingQueue blockingQueue =new LinkedBlockingDeque(); List<String> listThread1 =new ArrayList<>(); List<String> listThread2 =new ArrayList<>(); List<String> listThread3 =new ArrayList<>(); List<String> listThread4 =new ArrayList<>(); for (int i = 0 ; i < 100 ; i++){ blockingQueue.put("彩票号"+(i+1)); } ExecutorService executorService = Executors.newFixedThreadPool(4); try{ while (blockingQueue.size()>0) { executorService.execute(new Runnable() { @SneakyThrows @Override public void run() { switch (Integer.parseInt(Thread.currentThread().getName().substring(14))){ case 1: listThread1.add(blockingQueue.take().toString()); break; case 2: listThread2.add(blockingQueue.take().toString()); break; case 3: listThread3.add(blockingQueue.take().toString()); break; case 4: listThread4.add(blockingQueue.take().toString()); break; } Thread.yield(); } }); } }finally { log.info(""+listThread1); log.info(""+listThread2); log.info(""+listThread3); log.info(""+listThread4); //这个45是中奖的一个彩票 int x =45; if(listThread1.contains("彩票号"+x)) System.out.println("线程1中奖"); if(listThread2.contains("彩票号"+x)) System.out.println("线程2中奖"); if(listThread3.contains("彩票号"+x)) System.out.println("线程3中奖"); if(listThread4.contains("彩票号"+x)) System.out.println("线程4中奖"); } } } 上面写的比较简单一点,只是在一个main里面写了下,实际情况下,你可以将彩票制造机制造出来的彩票号放到一个队列里面,用redis或者mq都差不多(mq会更专业一点),然后producer制造,consumer接收,这时候你判断,如果队列里面的彩票全被接收完了,那你可以在接收了的线程的list中查找你想要的中奖号码。
补充下, while() 后,启动线程是异步的,也就是说100条数据,以上代码,启动线程次数会大于100;blockingQueue.take() 获取值,如果队列中没有值了,线程会处于阻塞状态,也就是说,线程池等待队列会越来越大,消费者会越来越多;[/quote]没有值了,那我岂不是执行到finally了
dkwuxiang 2020-05-14
  • 打赏
  • 举报
回复
引用 9 楼 mmmm0303 的回复:
import java.util.LinkedList; import java.util.Random; public class Thread2 { public static void main(String[] args) throws InterruptedException { LinkedList<Integer> list = new LinkedList<>(); Producer p = new Producer(list,10); Consumer c1 = new Consumer(list); Consumer c2 = new Consumer(list); Consumer c3 = new Consumer(list); Consumer c4 = new Consumer(list); Thread producer = new Thread(p); producer.setName("生产者线程"); Thread consumer1 = new Thread(c1); consumer1.setName("消费者1"); Thread consumer2 = new Thread(c2); consumer2.setName("消费者2"); Thread consumer3 = new Thread(c3); consumer3.setName("消费者3"); Thread consumer4 = new Thread(c4); consumer4.setName("消费者4"); producer.start(); consumer1.start(); consumer2.start(); consumer3.start(); consumer4.start(); } } class Producer implements Runnable { private final LinkedList<Integer> list; private final int maxSize; public Producer(LinkedList list, int i) { maxSize = i; this.list = list; } @Override public void run() { try { while(true) { //模拟耗时1s Thread.sleep(1000); synchronized (list) { if(list.size()==maxSize) { list.wait(); } else { list.add(produce()); list.notifyAll(); } } } } catch (InterruptedException e) { e.printStackTrace(); } } private int produce() { int n = new Random().nextInt(100); System.out.println( Thread.currentThread().getName() + " produce: " + n); return n; } } class Consumer implements Runnable { private final LinkedList<Integer> list; public Consumer(LinkedList list) { this.list = list; } @Override public void run() { while (true) { try { synchronized(list) { //模拟耗时 Thread.sleep(1000); if(list.isEmpty()) { list.wait(); } else { consume(list.poll()); list.notifyAll(); } } } catch (InterruptedException e) { e.printStackTrace(); } } } private void consume(Integer n) { System.out.println(Thread.currentThread().getName() + " consume: " + n); } } 兄弟们可以看看我这个代码怎么修改吗 我允许的结果不对 我想要的运行结果应该是 四个消费者各取得一个号码 然后我再判断谁中奖的 但现在为什么后面一直是消费者1 在消费
消费者的 else { consume(list.poll()); list.notifyAll(); break; } 拿到号码后,线程结束,就不会再竞争了
mmmm0303 2020-05-14
  • 打赏
  • 举报
回复
刚开始学这个线程嘛 还不是特别了解
  • 打赏
  • 举报
回复
引用 23 楼 mmmm0303 的回复:
但是还是没有人 解决谁中了奖啊?
主体都给你写出来了,你根据自己的业务需求完善即可,竟然还要写出谁中奖,那谁中奖再写出来是不是还要写颁奖啊?
mmmm0303 2020-05-14
  • 打赏
  • 举报
回复
import java.util.LinkedList; import java.util.Random; public class Thread2 { public static void main(String[] args) throws InterruptedException { LinkedList<Integer> list = new LinkedList<>(); Producer p = new Producer(list); Consumer c1 = new Consumer(list); Consumer c2 = new Consumer(list); Consumer c3 = new Consumer(list); Consumer c4 = new Consumer(list); Thread producer = new Thread(p); producer.setName("投注站"); Thread consumer1 = new Thread(c1); consumer1.setName("顾客1"); Thread consumer2 = new Thread(c2); consumer2.setName("顾客2"); Thread consumer3 = new Thread(c3); consumer3.setName("顾客3"); Thread consumer4 = new Thread(c4); consumer4.setName("顾客4"); System.out.println("今日只限4名顾客买彩票"); System.out.println(); producer.start(); consumer1.start(); consumer1.join(); System.out.println(); consumer2.start(); consumer2.join(); System.out.println(); consumer3.start(); consumer3.join(); System.out.println(); consumer4.start(); consumer4.join(); System.out.println(); System.out.println("本期的七星彩号码是:"); int prizenum[]=new int[7]; for(int i=0;i<7;i++) { prizenum[i] = new Random().nextInt(10); System.out.print(prizenum[i]+" ");} System.out.println(); } } class Producer implements Runnable { private final LinkedList<Integer> list; private final int maxSize; private int n; public Producer(LinkedList list) { maxSize = 5; this.list = list; } @Override public void run() { try { /*有4个消费者,每个消费者买7个号码,就有28个了*/ while(n<28) { Thread.sleep(1000); synchronized (list) { if(list.size()==maxSize) { list.wait(); } else { list.add(produce()); list.notifyAll(); n++; } } } } catch (InterruptedException e) { e.printStackTrace(); } } private int produce() { int n = new Random().nextInt(10); System.out.println( Thread.currentThread().getName() + " 卖出的彩票号码是: " + n); return n; } } class Consumer implements Runnable { private final LinkedList<Integer> list; private int j; public Consumer(LinkedList list) { this.list = list; } public void run() { /*一个消费者要买七张票*/ while (j<7) { try { synchronized(list) { Thread.sleep(1000); if(list.isEmpty()) { list.wait(); } else { consume(list.poll()); list.notifyAll(); j++; } } } catch (InterruptedException e) { e.printStackTrace(); } } } private void consume(Integer n) { System.out.println(Thread.currentThread().getName() + " 买的彩票号码是: " + n); } } 这是我最新的代码 但是没有解决 谁中奖 因为这个生产者生产了彩票就立马 被消费者消费了 我的想法是再用几个数组把每个消费者消费的号码记录起来 然后最后就是用随机数生成中奖号码 不知道哪个哥哥能提点一下
你看见了吗° 2020-05-14
  • 打赏
  • 举报
回复
引用 23 楼 mmmm0303 的回复:
但是还是没有人 解决谁中了奖啊?

要知道谁中奖,把消费者和彩票号关联起来,当开奖以后去遍历一遍,不就知道了
加载更多回复(15)

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧