碰到一個線程的算法,題目爲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