1. 程式人生 > >JAVA執行緒(補充)

JAVA執行緒(補充)

執行緒優先順序

package com.thread.priority;

/**
 * 執行緒優先順序:每個執行緒都有一個優先順序,高優先順序的執行緒執行優先於低優先順序執行緒
 * 預設優先順序:5
 * 範圍:1-10
 * 這個只有在次數特別多的情況下,效果才可能比較明顯
 * 
 * public final int getPriority() 返回執行緒的優先順序。 
 * public final void setPriority(int newPriority)更改執行緒的優先順序。
 */
public class PriorityDemo {
    public
static void main(String[] args) { Priority p = new Priority(); Thread p1 = new Thread(p, "a"); Thread p2 = new Thread(p, "b"); Thread p3 = new Thread(p, "c"); p1.setPriority(10); p3.setPriority(1); p1.start(); p2.start(); p3.start(); } } package
com.thread.priority; public class Priority implements Runnable { private int x = 30; @Override public void run() { while (x > 0) { System.out.println(Thread.currentThread().getName() + "***" + x); x--; } } }

守護執行緒以及等待執行緒

守護執行緒

package
com.thread.priority; /** * 假設main執行緒代表劉備 * public final void setDaemon(boolean on) * 將該執行緒標記為守護執行緒或使用者執行緒。當正在執行的執行緒都是守護執行緒時,Java 虛擬機器退出。 * 如果在執行的執行緒都是守護執行緒,那麼程式就會退出 * 舉例:坦克大戰 * */ public class JoinDemo { public static void main(String[] args) { Join j = new Join(); Thread t1 = new Thread(j, "關羽"); Thread t2 = new Thread(j, "張飛"); /** * 將這兩個執行緒設定為守護執行緒,守護主執行緒、 * 當主執行緒main停止了的時候,兩個守護執行緒也會停止 */ t1.setDaemon(true); t2.setDaemon(true); t1.start(); t2.start(); for (int x = 0; x < 5; x++) { System.out.println(Thread.currentThread().getName() + "---" + x); } } } package com.thread.priority; public class Join implements Runnable { private int x = 30; @Override public void run() { while (x > 0) { System.out.println(Thread.currentThread().getName() + "***" + x); x--; } } }

等待執行緒

package com.thread.priority;

/**
 *  
 *  public final void join(long millis)
 *  throws InterruptedException等待該執行緒終止的時間最長為 millis 毫秒。
 *      超時為 0 意味著要一直等下去。 
 *      讓其他的執行緒一直等著。   
 * 
 */
public class JoinDemo {
    public static void main(String[] args) throws InterruptedException {
        Join j = new Join();
        Thread t1 = new Thread(j, "關羽");
        Thread t2 = new Thread(j, "張飛");
        Thread t3 = new Thread(j, "諸葛亮");
        /**
         * 此處注意順序,join在哪些執行緒前面,哪些執行緒就得等待join執行緒結束才可以啟動
         */
        t3.start();
        t3.join();
        t1.start();
        t2.start();
    }
}

package com.thread.priority;

public class Join implements Runnable {

    @Override
    public void run() {
        for (int x = 0; x < 10; x++) {
            System.out.println(Thread.currentThread().getName() + "***" + x);
        }
    }
}

暫停執行緒

package com.thread.priority;

/**
 * public static void yield()暫停當前正在執行的執行緒物件,並執行其他執行緒。 
 * 為了讓執行緒間的執行更和諧一些
 * 但是。你想要看到資料的依次出現,還是依賴等待喚醒機制。
 * 
 */
public class YieldDemo {
    public static void main(String[] args) {
        Yield y = new Yield();
        Thread y1 = new Thread(y);
        Thread y2 = new Thread(y);
        y1.start();
        y2.start();
    }
}


package com.thread.priority;

public class Yield implements Runnable {
    private int x = 30;

    @Override
    public void run() {
        while (x > 0) {
            System.out.println(Thread.currentThread().getName() + "***" + x);
            Thread.yield();
            x--;
        }
    }
}

sleep()和wait()方法的區別:
sleep
sleep()是Thread類中的方法,
sleep必須指定引數,
sleep不釋放鎖物件,

wait()

wait()是Object中的方法
wait可以不用指定時間,可以指定時間
釋放所物件

多生產多消費模式

將方法notify()改為notifyAll()

匿名Thread

package com.thread.priority;

public class TestDemo {
    public static void main(String[] args) {
        new Thread() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    System.out.print(i + " ");
                }
                System.out.println();
            }
        }.start();

        new Thread(new Runnable() {

            @Override
            public void run() {
                for (int i = 5; i < 10; i++) {
                    System.out.print(i + " ");
                }
                System.out.println();
            }
        }) {
        }.start();
        new Thread(new Runnable() {

            @Override
            public void run() {
                for (int i = 10; i < 20; i++) {
                    System.out.print(i + "");
                }
            }
        }) {
        /**
             * 為什麼會列印此處的?
             * 通過檢視原始碼可以知道:
             *  Thread的run方法的功能是,先判斷target是否為null,
             *  如果不為null就呼叫target的run()方法
             * 可是我們這裡已經重寫了run方法,所以,不會執行原始碼Thread中的run方法,進而不會執行Runnable中 的run方法
             * @see java.lang.Thread#run()
             */
            @Override
            public void run() {
                for (int i = 20; i < 30; i++) {
                    //列印的是此處的
                    System.out.print(i + " ");
                }
            }
        }.start();
    }
}

java與模式 書籍。
大話設計模式
易學設計模式