JavaExp10:多线程设计,彩票购票问题
1. 编写10个线程,第一个线程从1加到10,第二个线程从11加到20……第十个线程从91加到100,main函数最后再把10个线程的结果相加显示。
package EXP2020.exp10;/*** @author JM* @date 2020/5/13*/
/**创建继承于Thread类的线程子类*/
class ThreadDemo extends Thread {public int num;//sum记录当前线程结果之和,Sum记录所有子线程结果相加之和public static int sum, Sum;//定义构造函数public ThreadDemo(int num) {this.num = num;}//重写run,实现累加求和public void run() {sum = 0;for (int i = num; i < num + 10; i++) {sum += i;}System.out.println(this.getName() + "的和:" + sum);Sum += sum;//每个线程的结果再累加}
}/**主类*/
public class MainTestOne {public static void main(String[] args) throws InterruptedException {//join会抛异常//创建10个线程Thread[] threads = new Thread[10];for (int i = 0; i < 10; i++) {threads[i] = new ThreadDemo(i * 10 + 1);threads[i].setName("线程" + (i + 1) + "");threads[i].start();//将10个子线程加入到主线程中,并且主线程会等待子线程结束之后才运行threads[i].join();}//最后输出所有线程总和结果System.out.println("10个线程结果相加为:" + ThreadDemo.Sum);}
}
2. 利用多线程实现彩票模拟程序:
package EXP2020.exp10;/*** @author JM* @date 2020/5/13*/import java.util.ArrayList;
import java.util.Collection;/*** 创建一个由产生彩票者和取彩票者共用的一个存储彩票类*/
class Tickets {private int[] windows = new int[10]; //设置取彩票的窗口供人们取彩票private static int ticketsCount; //产生或取出彩票的数目private int inPos, outPos; //把彩票存入和取出时对应窗口的下标//用于存放4个消费者取到的彩票Collection c1 = new ArrayList();Collection c2 = new ArrayList();Collection c3 = new ArrayList();Collection c4 = new ArrayList();//传入彩票的编号public synchronized void put(int ticketsNum) {while (ticketsCount == windows.length) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}windows[inPos] = ticketsNum;System.out.println("发放彩票中......当前发放的彩票号码为:" + windows[inPos]);inPos = (1 + inPos) % windows.length;ticketsCount++;this.notify();}//取彩票public synchronized void get() {while (ticketsCount == 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}int data = windows[outPos]; // 从数组中取出数据Recode(data);System.out.println(Thread.currentThread().getName() + "从窗口" + (outPos + 1) + "中取出号码为:" + data + "的彩票");windows[outPos] = 0;outPos = (outPos + 1) % windows.length;ticketsCount--;this.notifyAll();}//记录每个取票者取到的彩票信息,保存到容器public void Recode(int data) {if (Thread.currentThread().getName().equals("取票者1号"))c1.add(data);else if (Thread.currentThread().getName().equals("取票者2号"))c2.add(data);else if (Thread.currentThread().getName().equals("取票者3号"))c3.add(data);else if (Thread.currentThread().getName().equals("取票者4号"))c4.add(data);}
}/*** 生产彩票的线程类*/
class ProduceTickets implements Runnable {private Tickets tickets;protected static int prizeNum = 6666; //设置中奖号码为6666,也可以用Random产生private int ticketNum = 1; //设第一张彩票号码为1ProduceTickets(Tickets tickets) {this.tickets = tickets;}public void run() {while (ticketNum <= 10000) {tickets.put(ticketNum++);}System.out.println("票数已经发放完");}
}/*** 取彩票线程类*/
class ConsumeTicket implements Runnable {private Tickets tickets;ConsumeTicket(Tickets tickets) {this.tickets = tickets;}public void run() {while (true) {tickets.get();}}
}public class MainTestTwo {public static void main(String[] args) throws InterruptedException {//创建共用的彩票存储空间对象Tickets tickets = new Tickets();//创建生产和消费两个目标对象,传入tickets对象ProduceTickets producer = new ProduceTickets(tickets);ConsumeTicket consumes = new ConsumeTicket(tickets);//创建4个取彩票线程Thread[] threads = new Thread[4];System.out.println("..........................开始发放彩票.............................");//启动生产彩票的线程和取彩票者的线程Thread prod = new Thread(producer);prod.start();for (int i = 0; i < 4; i++) {threads[i] = new Thread(consumes);threads[i].setName("取票者" + (i + 1) + "号");threads[i].start();}Thread.sleep(2000);System.out.println(".........................所有彩票已经销售完.................................");//公布中奖号码System.out.println("中奖彩票号码是:" + ProduceTickets.prizeNum);//分别输出4个取票者取到的彩票Collection[] c = {tickets.c1, tickets.c2, tickets.c3, tickets.c4};for (int i = 0; i < 4; i++) {System.out.println("取票者" + (i + 1) + "号取到的彩票有:");System.out.println(c[i]);}//公布中奖的人for (int i = 0; i < 4; i++)if (c[i].contains(ProduceTickets.prizeNum))System.out.println("中奖的是:取票者" + (i + 1) + "号");System.exit(0);prod.join();for (int i = 0; i < 4; i++) {threads[i].join();}}
}
向右拉,验证成功
JavaExp10:多线程设计,彩票购票问题相关推荐
- Python之多线程:python多线程设计之同时执行多个函数命令详细攻略
Python之多线程:python多线程设计之同时执行多个函数命令详细攻略 目录 实现功能 采取方法 应用场景 实现功能 同时执行多个函数命令 采取方法 T1.单个实现 import threadin ...
- [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)
本文可任意转载,但必须注明作者和出处. [原创]手把手教你Linux下的多线程设计(一) --Linux下多线程编程详解 原 ...
- 如果让你设计铁道部购票网站,你怎么做
最近铁道部购票已经成为了热点话题,毛病多得一塌糊涂,如果让你来设计铁道部购票网站,你会怎么做? 这样的网站属于实时性要求较高.并发性要求非常高.容量要求一般的类型,以下是我简单的想法: 1.部署是基于 ...
- 【Qt】Qt多线程开发—实现多线程设计的四种方法
Qt-使用Qt实现多线程设计的四种方法 文章目录 Qt-使用Qt实现多线程设计的四种方法 一.写在前面 二.[方法一] QThread:带有可选事件循环的底层API 三.[方法二] QThreadPo ...
- 彩票模拟选号程序java_java课程设计-彩票购买抽奖程序
彩票抽奖程序 [TOC] ###可实现功能: 允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 允许注册用户购买彩票:手动选号.随机选号,并允许设置投注数. 抽奖功能:要求 ...
- Java多线程设计要点
1.多线程中有主内存和工作内存之分, 在JVM中,有一个主内存,专门负责所有线程共享数据:而每个线程都有他自己私有的工作内存, 主内存和工作内存分贝在JVM的stack区和heap区. 2.线程的状态 ...
- JAVA课程设计——彩票抽奖购买系统
一.项目介绍 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票:手动选号.随机选号,并允许设置投注数. 3.抽奖功能:要求屏幕上能够显示抽奖的 ...
- 彩票摇奖 java_Java课程设计——彩票购买抽奖系统
一.项目介绍 题目要求: 功能要求: 模拟福利彩票36选7,实现彩票的抽奖与中奖通知功能. 1.允许注册用户,用户信息包括用户id,用户名,密码,账户金额,电话号码等属性. 2.允许注册用户购买彩票: ...
- 透视Java多线程之一:多线程设计的使用
多线程是是我们程序设计中绕不开的问题,那么为什么多线程如此重要呢?因为这样做可以提高效率.其实多线程是整个世界运动的基本规律之一,多线程是绝对的,单线程是绝对的.例如在电影<红海行动-遇袭> ...
最新文章
- LeetCode 142. Linked List Cycle II--单向链表成环的起点--C++,Python解法
- mysql key value 排序_MySQL利用索引优化ORDER BY排序语句的方法
- ftp服务----基于虚拟用户的创建
- 拉文大学计算机科学,拉文大学
- Linux fwrite 什么时候刷新,linux的fwrite()使用方法,当前时间写入文本的程序
- Nginx学习之十四-GDB调试Nginx初试
- 一些实用的JS代码。
- Ubuntu14.04搭建Oracle instantClient 11.2.0.4并配置cx_Oracle5.1.2
- Makefile入门教程
- 【爬虫】微博数据采集
- php是一种通用开源,caozha-admin(PHP网站后台管理框架)
- wps垂直居中快捷键_word如何设置垂直居中 wpsword设置垂直居中
- 如何快速判断奇数和偶数
- 完美卸载office
- Angular4_安全导航操作符 ( ?. ) 和空属性路径
- 当职场中领导问是否有男朋友要怎么应对
- html移动端适配最优方法
- 想要选好群控系统! 还要先了解的群控发展史
- 【资源】可下载三维模型的网站
- 对象与对象变量 LJY第二周