線程入門-優先級

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

相關文章
相關標籤/搜索