你有两个问题。一个是线程需要花费一些时间才能启动,因此您可以通过顺序触发它们来给“低”一个不错的开始。另一个是线程优先级决定了在有处理器时间参数的情况下谁可以运行。有两个线程和8个有效的处理器内核,优先级并没有多大关系!这是一个固定的示例,该示例使用闩锁“同时”启动所有线程,并使用足够的线程来实际争夺资源,您可以看到优先级设置的效果。它给出了相当一致的结果。
static class Clicker implements Runnable{ BigInteger click = BigInteger.ZERO; Thread t; Clicker(int p){ t=new Thread(this); t.setPriority(p); } public void run(){ try { latch.await(); } catch(InterruptedException ie) {} while(running) click = click.add(BigInteger.ONE); } public void start(){ t.start(); }}public static volatile boolean running = true;public static final CountDownLatch latch = new CountDownLatch(1);public static void main(String args[]){ Thread.currentThread().setPriority(Thread.MAX_PRIORITY); List<Clicker> listLow = new ArrayList<Clicker>(); List<Clicker> listHigh = new ArrayList<Clicker>(); for (int i = 0; i < 16; i++) { listHigh.add(new Clicker(Thread.NORM_PRIORITY+4)); } for (int i = 0; i < 16; i++) { listLow.add(new Clicker(Thread.NORM_PRIORITY-4)); } for (Clicker clicker: listLow) { clicker.start(); } for (Clicker clicker: listHigh) { clicker.start(); } latch.countDown(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } running = false; BigInteger lowTotal = BigInteger.ZERO; BigInteger highTotal = BigInteger.ZERO; try { for (Clicker clicker: listLow) { clicker.t.join(); lowTotal = lowTotal.add(clicker.click); } for (Clicker clicker: listHigh) { clicker.t.join(); highTotal = highTotal.add(clicker.click); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("LO: "+lowTotal); System.out.println("HI: "+highTotal); }


