线程入门-优先级

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

相关文章
相关标签/搜索