import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by Administrator on 2017/9/1. */ public class SimplePriorities implements Runnable { private int countDown = 5; private volatile double d; private int priority; public SimplePriorities(int priority) { this.priority = priority; } public String toString() { return Thread.currentThread() + ":" + countDown; } @Override public void run() { Thread.currentThread().setPriority(priority); while (true) { for (int i = 0; i < 100000; i++) { d += (Math.PI + Math.E) / (double) i; if (i % 1000 == 0) { Thread.yield(); } System.out.println(this); if (--countDown == 0) return; } } } public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { exec.execute(new SimplePriorities(Thread.MAX_PRIORITY)); exec.execute(new SimplePriorities(Thread.MIN_PRIORITY)); } exec.shutdown(); } }
輸出結果:java
Thread[pool-1-thread-3,10,main]:5
Thread[pool-1-thread-10,1,main]:5
Thread[pool-1-thread-8,1,main]:5
Thread[pool-1-thread-3,10,main]:4
Thread[pool-1-thread-9,10,main]:5
Thread[pool-1-thread-1,10,main]:5
Thread[pool-1-thread-5,10,main]:5
Thread[pool-1-thread-7,10,main]:5
Thread[pool-1-thread-6,1,main]:5
Thread[pool-1-thread-2,1,main]:5
Thread[pool-1-thread-4,1,main]:5
Thread[pool-1-thread-4,1,main]:4
Thread[pool-1-thread-2,1,main]:4
Thread[pool-1-thread-2,1,main]:3
Thread[pool-1-thread-2,1,main]:2
Thread[pool-1-thread-6,1,main]:4
Thread[pool-1-thread-7,10,main]:4
Thread[pool-1-thread-7,10,main]:3
Thread[pool-1-thread-5,10,main]:4
Thread[pool-1-thread-1,10,main]:4
Thread[pool-1-thread-9,10,main]:4
Thread[pool-1-thread-3,10,main]:3
Thread[pool-1-thread-8,1,main]:4
Thread[pool-1-thread-10,1,main]:4
Thread[pool-1-thread-8,1,main]:3
Thread[pool-1-thread-3,10,main]:2
Thread[pool-1-thread-9,10,main]:3
Thread[pool-1-thread-1,10,main]:3
Thread[pool-1-thread-5,10,main]:3
Thread[pool-1-thread-7,10,main]:2
Thread[pool-1-thread-6,1,main]:3
Thread[pool-1-thread-2,1,main]:1
Thread[pool-1-thread-4,1,main]:3
Thread[pool-1-thread-6,1,main]:2
Thread[pool-1-thread-7,10,main]:1
Thread[pool-1-thread-5,10,main]:2
Thread[pool-1-thread-5,10,main]:1
Thread[pool-1-thread-1,10,main]:2
Thread[pool-1-thread-9,10,main]:2
Thread[pool-1-thread-3,10,main]:1
Thread[pool-1-thread-8,1,main]:2
Thread[pool-1-thread-10,1,main]:3
Thread[pool-1-thread-8,1,main]:1
Thread[pool-1-thread-9,10,main]:1
Thread[pool-1-thread-1,10,main]:1
Thread[pool-1-thread-6,1,main]:1
Thread[pool-1-thread-4,1,main]:2
Thread[pool-1-thread-10,1,main]:2
Thread[pool-1-thread-4,1,main]:1
Thread[pool-1-thread-10,1,main]:1ide
Process finished with exit code 0
this
示例二:線程
import java.util.Map; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Created by Administrator on 2017/9/1. */ public class SimplePriorities implements Runnable { private int countDown = 5; private volatile double d; private int priority; public SimplePriorities(int priority) { this.priority = priority; } public String toString() { return Thread.currentThread() + ":" + countDown; } @Override public void run() { Thread.currentThread().setPriority(priority); while (true) { for (int i = 0; i < 100000; i++) { d += (Math.PI + Math.E) / (double) i; if (i % 1000 == 0) { Thread.yield(); } System.out.println(this); if (--countDown == 0) return; } } } public static void main(String[] args) { ExecutorService exec = Executors.newCachedThreadPool(); // for (int i = 0; i < 5; i++) { exec.execute(new SimplePriorities(Thread.MAX_PRIORITY)); exec.execute(new SimplePriorities(Thread.MIN_PRIORITY)); // } exec.shutdown(); } }
輸出結果:調試
Thread[pool-1-thread-2,1,main]:5
Thread[pool-1-thread-2,1,main]:4
Thread[pool-1-thread-1,10,main]:5
Thread[pool-1-thread-2,1,main]:3
Thread[pool-1-thread-1,10,main]:4
Thread[pool-1-thread-2,1,main]:2
Thread[pool-1-thread-1,10,main]:3
Thread[pool-1-thread-2,1,main]:1
Thread[pool-1-thread-1,10,main]:2
Thread[pool-1-thread-1,10,main]:1code
Process finished with exit code 0對象
總結:toString方法被覆蓋,以便使用Thread.toString()方法來打印線程的名稱、線程的優先級以及線程所屬的線程組。能夠經過構造器來設置這個名稱;這裏是自動生成的名稱,如pool-1-thread-1,pool-1-thread-2等。覆蓋後的toString()方法還打印了線程的倒計數值。it
能夠在一個任務的內部,經過調用Thread.currentThread()來得到對驅動該任務的Thread對象的引用。io
書中裏講經過大量運算,線程調試機制得以引入,能夠發現優先級高(10級)會被先引用,但實際運行並不是如此。充滿疑問。class