不按順序完整輸出1-n

碰到一個線程的算法,題目爲java

某公司組織年會,會議入場時有兩個入口,在入場時每位員工都能獲取一張雙色球彩票,假設公司有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位員工

查看了別人的代碼爲dom

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();
	}
}

找到了不少的優點的地方,有一個地方是精髓ide

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);//輸出結果
		}

這裏也是我想要總結的地方.這裏能夠用於輸出.this

相關文章
相關標籤/搜索