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