文档章节

不按顺序完整输出1-n

忘川-hsm
 忘川-hsm
发布于 2017/05/29 16:24
字数 941
阅读 36
收藏 0

碰到一个线程的算法,题目为

某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工。
 * 利用多线程模拟年会入场过程,并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。
 * 线程运行后打印格式如下:
 * 		编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
 * 		编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
 * 		//.....
 * 		从后门入场的员工总共: 13 位员工
 * 		从前门入场的员工总共: 87 位员工

当时的想法就是同步输出:代码如下,认为有很多的瑕疵:

package com.hsm.mythread;

public class EntryThread implements Runnable {
	static int i=1;
	static int a1=0;
	static int a2=0;
	static ThreadLocal<Integer> sum=new ThreadLocal<Integer>();
	@Override
	public void run() {
		while(true){
			synchronized(this){
				
				if("1".equals(Thread.currentThread().getName())){
					a1++;
					System.out.println("编号为: "+(i++) +"的员工 从后门 入场!");
				}else{
					a2++;
					System.out.println("编号为: "+(i++) +"的员工 从前门 入场!");
				}
				if(i>=101){
					if("1".equals(Thread.currentThread().getName())){
						System.out.println("从后门入场的员工总共: "+a1+"位员工");
					}else{
						System.out.println("从后门入场的员工总共: "+a2+"位员工");
					}
					break;
				}
			}
		}
	}

}
package com.hsm.mythread;

import java.util.ArrayList;
import java.util.Random;

public class MultiThread {
	static Random rd = new Random();
	public static void main(String[] args) {
		EntryThread a1=new EntryThread();
		EntryThread a2=new EntryThread();
		Thread b1=new Thread(a1, "1");
		Thread b2=new Thread(a2, "2");
		b1.start();
		b2.start();
	}
}

结果如下:

编号为: 98的员工 从前门 入场!
编号为: 99的员工 从后门 入场!
编号为: 100的员工 从前门 入场!
从后门入场的员工总共: 41位员工
从后门入场的员工总共: 59位员工

查看了别人的代码为

package com.hsm.mythread;

import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.Random;

public class Test03 {

	/**
	 * 某公司组织年会,会议入场时有两个入口,在入场时每位员工都能获取一张双色球彩票,假设公司有100个员工。
	 * 利用多线程模拟年会入场过程,并分别统计每个入口入场的人数,以及每个员工拿到的彩票的号码。
	 * 线程运行后打印格式如下:
	 * 		编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
	 * 		编号为: 1 的员工 从后门 入场! 拿到的双色球彩票号码是: [06, 11, 14, 22, 29, 32, 15]
	 * 		//.....
	 * 		从后门入场的员工总共: 13 位员工
	 * 		从前门入场的员工总共: 87 位员工
	 */
	public static void main(String[] args) {
		ArrayList<Integer> al = new ArrayList<Integer>();
		for (int i = 1; i <= 10; i++) {
			al.add(i);
		}
		
		GoIn.list = al;
		GoIn gi1 = new GoIn();
		gi1.setName("前门");
		GoIn gi2 = new GoIn();
		gi2.setName("后门");
		gi1.start();
		gi2.start();
		
	}
}

class GoIn extends Thread {
	public static ArrayList<Integer> list;
	static Random rd = new Random();
	int count;
	public void run() {
		while(true) {
			synchronized (GoIn.class) {
				if(list.size() == 0){
					//从后门入场的员工总共: 13 位员工
					System.out.println("从"+Thread.currentThread().getName()+"入场的员工总共: "+ count +"位员工");
					break;
				}else {
					try {
						Thread.sleep(200);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					int index = rd.nextInt(list.size());
					int i = list.remove(index);
					System.out.println(i);
					count++;
					//编号为: 2 的员工 从后门 入场! 拿到的双色球彩票号码是: [17, 24, 29, 30, 31, 32, 07]
					System.out.println("编号为: "+ i +"的员工 从"+Thread.currentThread().getName()+"入场! 拿到的双色球彩票号码是:" + getDoubleColor());
				}
			}
		}
	}

	private static  String getDoubleColor() {
		LinkedHashSet<Integer> lhs = new LinkedHashSet<Integer>();
		while(lhs.size() < 7){
			lhs.add(rd.nextInt(32) + 1);
		}
		return lhs.toString();
	}
}

找到了很多的优势的地方,有一个地方是精髓

int j=0;
		ArrayList<Integer> al = new ArrayList<Integer>();
		for (int i = 1; i <= 10; i++) {
			al.add(i);
		}
		for(int i=0;i<10;i++){
			int index = rd.nextInt(al.size());//随机取list长度的索引
			j=al.remove(index);//去掉索引对应的值
			System.out.println(j);//输出结果
		}

这里也是我想要总结的地方.这里可以用于输出.

© 著作权归作者所有

忘川-hsm
粉丝 8
博文 84
码字总数 50675
作品 0
深圳
程序员
私信 提问
谷歌面试题 | 灯泡开关2

专栏 | 九章算法 网址 | www.jiuzhang.com 题目描述 房间里有n盏灯,初始时全是亮的,房间的墙上有4个按钮。问在按了恰好m次按钮后,n盏灯的状态共有多少种可能,返回这个值。 设n盏灯的标号...

九章算法
2017/10/28
0
0
C#语言————第一章 第一个C#程序

第一章 第一个C#程序 C#程序* ①:建立项目:文件-->新建-->项目-->c#-->控制台程序(项目名/文件存储位置)-->确定 ①:c#程序 namespace:命名空间; 相当于java中的package(声明包) using...

九之者
2018/11/11
0
0
python 函数参数介绍

python 函数的参数形式有很多种,下面用计算多次方和举例子: 普通参数(必选参数) 默认值参数(n=2) 可变参数 关键字参数 组合参数 最神奇的是通过一个tuple和dict,你也可以调用该函数:...

jacked
2016/09/08
28
0
http压力测试工具--httpsender

httpsender是一款轻量级的http压力测试工具,由淘宝的测试工程师用Java语言开发完成。它可以指定并发连接数发送指定数目的请求,还可以自定义请求的header头。请求的URL支持通过正则表达式指...

邓悟
2011/05/31
12.3K
1
C Primer Plus 第11章 11.13 编程练习答案

1、设计并测试一个函数,可以从输入读取n个字符(包括空格、制表符和换行符),把结果存储在一个数组中,这个数组的地址通过参数来传递。 2、修改并测试练习1中的函数,使得可以在n个字符后,...

idreamo
2016/09/22
388
0

没有更多内容

加载失败,请刷新页面

加载更多

佳博标签打印问题-

由于网页打印不行,要么sdk 写成activex,这样浏览器支持又有局限。 因此,采用客户端编写打印服务启动,定时轮询服务端打印队列,从服务的获取打印队列进行打印。 服务端web 点击打印,讲打...

mellen
24分钟前
2
0
Jmeter利用JMXMon插件监控服务器JVM情况

1、Jmeter下载JMXMon插件 2、Jmeter 添加 JMXMon请求 远程监控JVM状态需要在JVM启动时候加上一段参数才行,在tomcat bin目录下找到catalina.sh 在# OS specific support. $var _must_ be set...

覃光林
25分钟前
3
0
Qt编写安防视频监控系统(界面很漂亮)

一、前言 视频监控系统在整个安防领域,已经做到了烂大街的程序,全国起码几百家公司做过类似的系统,当然这一方面的需求量也是非常旺盛的,各种定制化的需求越来越多,尤其是这几年借着人脸...

飞扬青云
29分钟前
3
0
Python的requests库中的Put方式使用

1.后端接口 @PutMapping public ResponseEntity<MyObject> putMyObject( @RequestBody MyObject myObject) { ... } Put请求参数在请求体里面。 1.前端请求 import requestsimpo......

亚林瓜子
30分钟前
1
0
全站加速(DCDN)- IP应用加速产品解读

5月22日下午15点,阿里云全站加速(DCDN)-IP应用加速如期发布。IP应用加速是阿里云自主研发的一款更高效、更安全、更便捷的动态加速产品,结合阿里云CDN本身的资源优势,利用就近接入、智能...

迷你芊宝宝
34分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部