1. 程式人生 > 實用技巧 >執行緒基礎 執行緒之間的共享和協作(進一步認識Java裡的執行緒)

執行緒基礎 執行緒之間的共享和協作(進一步認識Java裡的執行緒)

執行緒常用方法和執行緒的狀態

執行緒的生命週期圖,及其呼叫執行緒的方法會改變的狀態

呼叫run和start()的區別

package org.dance.day1;

import org.dance.tools.SleepTools;

/**
 * 執行緒呼叫 run 和 start 方法的區別
 * @author ZYGisComputer
 */
public class StartAndRun {

    /**
     * 繼承Thread類
     */
    private static class ThreadRun extends Thread{
        @Override
        
public void run() { int i = 90; while (i>0){ SleepTools.ms(1000); System.out.println("I am "+Thread.currentThread().getName()+" and now the i = "+ i); i--; } } } public static void main(String[] args) {
// 執行run // executeRun(); // 執行start executeStart(); } public static void executeRun(){ ThreadRun thread = new ThreadRun(); thread.setName("run"); // 呼叫執行緒的Run方法 thread.run(); // 執行結果 // I am main and now the i = 90 } public
static void executeStart(){ ThreadRun thread = new ThreadRun(); thread.setName("run"); // 呼叫執行緒的Run方法 thread.start(); // 執行結果 // I am run and now the i = 90 } }

SleepTools.java這個只是一個小工具類,用於執行緒休眠的

package org.dance.tools;

import java.util.concurrent.TimeUnit;

/**
 * 類說明:執行緒休眠輔助工具類
 */
public class SleepTools {

    /**
     * 按秒休眠
     * @param seconds 秒數
     */
    public static final void second(int seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch (InterruptedException e) {
        }
    }

    /**
     * 按毫秒數休眠
     * @param seconds 毫秒數
     */
    public static final void ms(int seconds) {
        try {
            TimeUnit.MILLISECONDS.sleep(seconds);
        } catch (InterruptedException e) {
        }
    }
}

執行緒的優先順序:

  取值為1~10,預設為5,但是執行緒的優先順序並不可靠,不建議作為執行緒開發時候的手段,因為有的作業系統可能會忽略執行緒的執行優先順序,所以開發中需要將這個不確定因素列如其中

設定執行緒的優先順序方法,在原始碼中可以看見最小是1預設是5最大是10大於或者小於報錯

/**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;

   /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;

public final void setPriority(int newPriority) {
        ThreadGroup g;
        checkAccess();
      
if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPriority = g.getMaxPriority(); } setPriority0(priority = newPriority); } }

守護執行緒:

  和主執行緒共死,finally不能保證一定會執行

package org.dance.day1;

import org.dance.tools.SleepTools;

/**
 * 守護執行緒
 * @author ZYGisComputer
 */
public class DaemonThread {

    /**
     * 繼承Thread類
     */
    private static class UseThread extends Thread {

        public UseThread(String threadName) {
            super(threadName);
        }

        @Override
        public void run() {
            try {
                String name = Thread.currentThread().getName();
                while (!isInterrupted()) {
                    System.out.println("當前執行緒:" + name);
                }
                System.out.println(name + " interrupt flag is " + isInterrupted());
            } finally {
                System.out.println("執行 finally");
            }
        }
    }

    public static void main(String[] args) {
        // 執行不是守護執行緒
//        noDaemon();
        // 執行守護執行緒
        daemon();
        // 對比之下就可以看到
        // 不是守護執行緒 需要中斷 主執行緒執行完畢之後不會停止 finally語句塊一定會執行
        // 守護執行緒 主執行緒執行完畢立即停止 finally語句塊不一定會執行
    }

    public static void noDaemon(){
        UseThread useThread = new UseThread("DaemonThread");
        useThread.start();
        SleepTools.ms(5);
        useThread.interrupt();
    }

    public static void daemon(){
        UseThread useThread = new UseThread("DaemonThread");
        useThread.setDaemon(true);
        useThread.start();
        SleepTools.ms(5);
    }

}

yield()方法

  讓出CPU的執行權,將執行緒的狀態從執行轉到可執行狀態,但是下個時間片,該執行緒依然有可能被再次選中執行

作者:彼岸舞

時間:2020\09\15

內容關於:併發程式設計

本文來源於網路,只做技術分享,一概不負任何責任