Java基礎之線程阻塞


    線程總是存在優先級,優先級范圍在1~10之間,線程默認優先級是5; JVM線程調度程序是基於優先級的搶先調度機制; 在大多數情況下,當前運行的線程優先級將大於或等於線程池中任何線程的優先級

package unit_fifteen;

public class TestPriority {

    public static void main(String[] args) {
        Thread tone = new ThreadOne();
        // 線程的默認優先級為5,這里設置為10
        tone.setPriority(10);
        // 獲取tone的優先級
        System.out.println(tone.getPriority());
        // 當前線程為Main()主線程
        System.out.println(Thread.currentThread().getName());
        tone.start();
        Thread ttwo = new ThreadTwo();
        ttwo.start();

    }

}

class ThreadOne extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("我是第" + i + "個阿三!");
            System.out.println(Thread.currentThread().getName() + i);
        }
    }

}

class ThreadTwo extends Thread {

    @Override
    public void run() {
        for (int j = 0; j < 5; j++) {
            System.out.println("我是第" + j + "個李四!");
        }
    }

}

    注意:當設計多線程應用程序的時候,一定不要依賴於線程的優先級。因為線程調度優先級操作是沒有保障的,只能把線程優先級作用作為一種提高程序效率的方法,但是要保證程序不依賴這種操作

    Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)靜態方法強制當前正在執行的線程休眠(暫停執行),以“減慢線程”。當線程睡眠時,它入睡在某個地方,在蘇醒之前不會返回到可運行狀態。當睡眠時間到期,則返回到可運行狀態;sleep()是靜態方法,只能控制當前正在運行的線程

 

package unit_fifteen;

public class MyThread extends Thread {

    public void run() {
        for (int i = 0; i <=20; i++) {
            if ((i) % 10 == 0) {
                System.out.println("-------" + i);
            } 
            System.out.print(i);
            try {
                //睡眠1秒
                Thread.sleep(1000); 
                System.out.print("線程睡眠1秒!\n");
            } catch (InterruptedException e) {
                e.printStackTrace(); 
            } 
        } 
    } 

    public static void main(String[] args) {
        new MyThread().start();
    } 
}

 

    Thread.yield()方法作用是:暫停當前正在執行的線程對象,並執行其他線程。yield()應該做的是讓當前運行線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調度程序再次選中

    Thread的非靜態方法join()讓一個線程B“加入”到另外一個線程A的尾部。在A執行完畢之前,B不能工作

package unit_fifteen;

public class MyThread {

    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            new ThreadOneDemo().start();
            if (i == 3) {
                try {
                    // 調用join()方法
                    Thread t = new ThreadTwoDemo();
                    t.start();
                    t.join();
                } catch (InterruptedException e) {
                    // TODO 自動生成的 catch 塊
                    e.printStackTrace();
                }
            }
        }
    }
}

class ThreadOneDemo extends Thread {
    public void run() {
        System.out.println("我正在運行!");
    }
}

class ThreadTwoDemo extends Thread {
    public void run() {
        for (int j = 0; j < 5; j++) {
            System.out.println("我是新加入者!");
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM