1. 程式人生 > >執行緒簡介和執行緒優先順序

執行緒簡介和執行緒優先順序

1.執行緒

執行緒:又稱輕量級程序,是現代作業系統的最小排程單元。JAVA從誕生開始就明智的選擇了內建對多執行緒的支援。

在一個程序中可以建立多個執行緒,這些執行緒擁有各自的計數器、堆疊和區域性變數等特性,並且能夠訪問共享的記憶體變數。在JVM中,我們也可以瞭解到,程式計數器、虛擬機器棧和本地方法棧都是執行緒私有的。
執行緒切換與程序切換相比,代價開銷較小, 因此能夠提高CPU效率。

關於程序與執行緒,推薦閱讀阮一峰的網路日誌

2.執行緒優先順序

現代作業系統基本採用時分的形式排程執行的執行緒,執行緒分配得到的時間片的多少決定了執行緒使用處理器資源的多少,也對應了執行緒優先順序這個概念。在JAVA執行緒中,通過一個int priority來控制優先順序,範圍為1-10,其中10最高,預設值為5。下面是原始碼(基於1.8)中關於priority的一些量和方法。

private int            priority;

    /**
     * Changes the priority of this thread.
     * <p>
     * First the <code>checkAccess</code> method of this thread is called
     * with no arguments. This may result in throwing a
     * <code>SecurityException</code>.
     * <p>
     * Otherwise, the priority of this thread is set to the smaller of
     * the specified <code>newPriority</code> and the maximum permitted
     * priority of the thread's thread group.
     *
     * @param
newPriority priority to set this thread to * @exception IllegalArgumentException If the priority is not in the * range <code>MIN_PRIORITY</code> to * <code>MAX_PRIORITY</code>. * @exception SecurityException if the current thread cannot modify * this thread. * @see
#getPriority * @see #checkAccess() * @see #getThreadGroup() * @see #MAX_PRIORITY * @see #MIN_PRIORITY * @see ThreadGroup#getMaxPriority() */
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); } } /** * Returns this thread's priority. * * @return this thread's priority. * @see #setPriority */ public final int getPriority() { return priority; }

顯然,對於需要較多CPU時間的執行緒需要設定較低的優先順序,這樣可以確保處理器不會被獨佔。

另外:

執行緒優先順序不能作為程式正確性的依賴,因為作業系統可以完全不用理會JAVA執行緒對於優先順序的設定。——->《JAVA併發程式設計基礎》

下面是一個關於執行緒優先順序的程式:

package com.xidian.sortthird;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

public class TestPriority
{
    private static volatile boolean notStart=true;
    private static volatile boolean notEnd=true;

    public static void main(String[] args) throws Exception
    {
        List<Job> jobs = new ArrayList<>();
        for(int i = 0;i<10;i++)
        {
            int priority = i<5?Thread.MIN_PRIORITY:Thread.MAX_PRIORITY;
            Job job=new Job(priority);
            jobs.add(job);
            Thread thread=new Thread(job, "Thread:"+i);
            thread.setPriority(priority);
            thread.start();

        }//使用這個迴圈啟動了10個執行緒

        notStart=false;
        TimeUnit.SECONDS.sleep(10);//main執行緒沉睡10s,使得10個小執行緒執行結束
        notEnd=false;

        for(Job job:jobs)
        {
            System.out.println("JOB priority:"+job.priority+","+job.jobCount);
        }
    }
    static class Job implements Runnable
    {
        private int priority;
        private long jobCount;
        public Job(int priority)
        {
            this.priority=priority;
        }
        public void run()
        {
            while(notStart)
            {
                Thread.yield();//這裡確保main執行緒將10個小執行緒啟動成功
            }

            while(notEnd)
            {
                Thread.yield();//這裡讓出CPU資源,使得10個執行緒自由競爭。
                jobCount++;//記錄競爭狀態,反映執行緒的優先順序。
            }
        }
    }
}

下面是執行結果,不過這個結果有很大的迷惑性:

JOB priority:1,1099494
JOB priority:1,1097710
JOB priority:1,1099911
JOB priority:1,1100411
JOB priority:1,1099721
JOB priority:10,5208263
JOB priority:10,5198474
JOB priority:10,5213148
JOB priority:10,5184842
JOB priority:10,5172312

可以看出,的確是優先順序高的得到的時間片較多,但是這個結果是具有迷惑性的,讓我們看一下LINUX環境下的執行結果:

JOB priority:1,3075988

JOB priority:1,2899121

JOB priority:1,2843459

JOB priority:1,2780645

JOB priority:1,2910943

JOB priority:10,3243229

JOB priority:10,12090519

JOB priority:10,3027128

JOB priority:10,6275521

JOB priority:10,2995204

從上面這個結果可以看出,作業系統並沒有理會我們設定的執行緒優先順序。

相關推薦

執行簡介執行優先順序

1.執行緒 執行緒:又稱輕量級程序,是現代作業系統的最小排程單元。JAVA從誕生開始就明智的選擇了內建對多執行緒的支援。 在一個程序中可以建立多個執行緒,這些執行緒擁有各自的計數器、堆疊和區域性變數等特性,並且能夠訪問共享的記憶體變數。在JVM中,我們也可以

守護執行、非守護執行簡介addShutdownHook方法使用

  1,首先什麼是守護執行緒,什麼是非守護執行緒呢 下面是網上資料總結如下: Java有兩種Thread:“守護執行緒Daemon”(守護執行緒)與“使用者執行緒User”(非守護執行緒)。 從字面上我們很容易將守護執行緒理解成是由虛擬機器(virtual machine)

執行退出執行資源回收問題

最近專案中遇到迴圈8M的記憶體洩漏問題,排查後發現是由於特殊場景下使子執行緒異常退出,主執行緒發現子執行緒退出便再次建立執行緒,此時未回收退出執行緒的資源造成了記憶體洩漏,導致資料庫宿主機oom,此問題不僅導致記憶體洩漏,還會使執行緒控制代碼用完導致其他程序無法分配執行緒的風險。 下面來

Java——多執行基本使用(四) 執行執行池的使用,工廠設計模式的使用

1.執行緒組的概述和使用 Java中使用ThreadGroup來表示執行緒組,它可以對一批執行緒進行分類管理,Java允許程式直接對執行緒組進行控制。            &n

執行概述、執行控制執行私有資料

一、執行緒概述   在許多經典的作業系統教科書中,總是把程序定義為程式的執行例項,它並不執行什麼, 只是維護應用程式所需的各種資源,而執行緒則是真正的執行實體。在一個程序中的多個執行路線叫做執行緒。為了

執行執行相關類

執行緒池概述 系統啟用一個新執行緒的成本是比較高的,因為它涉及與作業系統互動。在這種情形下,使用執行緒池可以很好的提高效能。執行緒池在系統啟動時即建立大量空閒的執行緒,程式將一個Runnable物件或Callable物件傳給執行緒池,執行緒池會啟動一個執行緒來執行它們的run()或call方

執行同步執行安全

執行緒同步 同步就是協同步調,按預定的先後次序進行執行。如:你說完,我再說。 “同”字從字面上容易理解為一起動作,其實不是,“同”字應是指協同、協助、互相配合。 如程序、執行緒同步,可理解為程序或執行緒A和B一塊配合,A執行到一定程度時要依靠B的某個結果,於是停下

控制執行(NSThread)執行時迴圈(NSRunLoop)的退出

原文地址:http://shaheengandhi.com/controlling-thread-exit/ 這是講iOS的執行緒的文章,下面的內容,自己都慘不忍睹啊,哈哈,練習翻譯一下文章,英語太差啊,儘量止步吧。。。。 ------------------------

Java 執行執行池區別

執行緒組: 執行緒組存在的意義,首要原因是安全。 java預設建立的執行緒都是屬於系統執行緒組,而同一個執行緒組的執行緒是可以相互修改對方的資料的。 但如果在不同的執行緒組中,那麼就不能“跨執行緒組”

Java自定義執行執行總數控制

1 概述池化是常見的思想,執行緒池是非常典型的池化的實現,《Java併發程式設計實戰》也大篇幅去講解了Java中的執行緒池。本文實現一個簡單的執行緒池。 2 核心類 【1】介面定義 public interface IThreadPool<Job extends

關於Java多執行執行同步執行通訊的一些小問題(順便分享幾篇高質量的博文)

一、對於執行緒同步和同步鎖的理解(注:分享了三篇高質量的部落格) 以下我精心的挑選了幾篇博文,分別是關於對執行緒同步的理解和如何選擇執行緒鎖以及瞭解執行緒鎖的作用範圍。 <一>執行緒同步鎖的選擇 2. 以上推薦的博文是以賣火車票為例,引出了非同步會導致的錯誤以及同步鎖(監視器)應該如果選擇,

什麼是執行安全執行不安全

首先要明白執行緒的工作原理,jvm有一個main   memory,而每個執行緒有自己的working   memory,一個執行緒對一個variable進行操作時,都要在自己的working   memory裡面建立一個copy,操作完之後再寫入main   memory。多個執行緒同時操作同一個varia

執行安全執行不安全的區別

程序和執行緒: 1)程序是靜態的,其實就是指開啟的一個程式;而執行緒是動態的,是真正執行的單元,執行的過程。其實我們平時看到的程序,是執行緒在執行著,因為執行緒是作為程序的一個單元存在的。 2)同樣作為基本的執行單元,執行緒是劃分得比程序更小的執行單位。 3)每個程

執行簡介(多執行001)

4個基本概念 同步 之前寫程式的時候都是從上到下,從左到右,程式碼執行順序1個執行緒執行多個任務,也是依次執行,1個執行緒同一時間執行1個任務非同步 多個執行緒可以 "同時" 執行多個任務 程序 當前

Java使用執行執行工廠

package com.uno.thread; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.u

執行安全執行同步Synchronized

執行緒安全就是多執行緒訪問時,採用了加鎖機制,當一個執行緒訪問該類的某個資料時,進行保護,其他執行緒不能進行訪問直到該執行緒讀取完,其他執行緒才可使用。不會出現資料不一致或者資料汙染。 執行緒不安全就是不提供資料訪問保護,有可能出現多個執行緒先後

黑馬程式設計師_基礎加強_Java執行通訊執行併發庫

 ------- android培訓、java培訓、期待與您交流! ---------- java5的執行緒鎖技術 Lock&Condition實現執行緒同步通訊 Lock比傳統的synchronized方式更加面向物件,兩個執行緒執行的程式碼塊要實現同步互斥,

Java多執行中Synchronized簡介Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

1.0-併發程式設計-程序執行簡介

程序程序是資源(CPU、記憶體等)分配的基本單位,它是程式執行時的一個例項。程式執行時系統就會建立一個程序,併為它分配資源,然後把該程序放入程序就緒佇列,程序排程器選中它的時候就會為它分配CPU時間,程式開始真正執行。 執行緒執行緒是程式執行時的最小單位,它是程序的一個執行流,是CPU排程和分派的基本單位,

java第16天----TreeMap的注意點,增強for迴圈,ArraysCollecttions工具類,多執行簡介

昨天知識總結 1.泛型 泛型的定義 泛型的基礎 泛型在類上,介面上,方法上的使用 泛型–限制上限,限制下線 2.Map Map與Collection的比較 Map介面常用方法 Map的遍歷----會—重點 HashMap的去重和TreeMap的排序 Tre