ThreadPriority 列挙型

定義

Thread のスケジューリング優先順位を指定します。Specifies the scheduling priority of a Thread.

public enum class ThreadPriority
[System.Runtime.InteropServices.ComVisible(true)]
[System.Serializable]
public enum ThreadPriority
type ThreadPriority = 
Public Enum ThreadPriority
継承
ThreadPriority
属性

フィールド

AboveNormal 3

Thread は優先順位が Highest のスレッドから Normal のスレッドの間にスケジュールできます。The Thread can be scheduled after threads with Highest priority and before those with Normal priority.

BelowNormal 1

Thread は優先順位が Normal のスレッドから Lowest のスレッドの間にスケジュールできます。The Thread can be scheduled after threads with Normal priority and before those with Lowest priority.

Highest 4

Thread は、どの優先順位のスレッドの前にでもスケジュールできます。The Thread can be scheduled before threads with any other priority.

Lowest 0

Thread は、ほかのどの優先順位のスレッドの後でもスケジュールできます。The Thread can be scheduled after threads with any other priority.

Normal 2

Thread は優先順位が AboveNormal のスレッドから BelowNormal のスレッドの間にスケジュールできます。The Thread can be scheduled after threads with AboveNormal priority and before those with BelowNormal priority. スレッドの既定の優先順位は Normal です。Threads have Normal priority by default.

次のコード例は、スレッドの優先度を変更した結果を示しています。The following code example shows the result of changing the priority of a thread. 3つのスレッドが作成され、1つのスレッドの優先度が BelowNormal に設定され、2番目のスレッドの優先度が AboveNormal に設定されます。Three threads are created, the priority of one thread is set to BelowNormal, and the priority of a second is set to AboveNormal. 各スレッドは、while ループ内の変数をインクリメントし、設定された時間に実行します。Each thread increments a variable in a while loop and runs for a set time.

using System;
using System.Threading;
using Timers = System.Timers;

class Test
{
    static void Main()
    {
        PriorityTest priorityTest = new PriorityTest();

        Thread thread1 = new Thread(priorityTest.ThreadMethod);
        thread1.Name = "ThreadOne";
        Thread thread2 = new Thread(priorityTest.ThreadMethod);
        thread2.Name = "ThreadTwo";
        thread2.Priority = ThreadPriority.BelowNormal;
        Thread thread3 = new Thread(priorityTest.ThreadMethod);
        thread3.Name = "ThreadThree";
        thread3.Priority = ThreadPriority.AboveNormal;

        thread1.Start();
        thread2.Start();
        thread3.Start();
        // Allow counting for 10 seconds.
        Thread.Sleep(10000);
        priorityTest.LoopSwitch = false;
    }
}

class PriorityTest
{
    static bool loopSwitch;
    [ThreadStatic] static long threadCount = 0;

    public PriorityTest()
    {
        loopSwitch = true;
    }

    public bool LoopSwitch
    {
        set{ loopSwitch = value; }
    }

    public void ThreadMethod()
    {
        while(loopSwitch)
        {
            threadCount++;
        }
        Console.WriteLine("{0,-11} with {1,11} priority " +
            "has a count = {2,13}", Thread.CurrentThread.Name, 
            Thread.CurrentThread.Priority.ToString(), 
            threadCount.ToString("N0")); 
    }
}
// The example displays output like the following:
//    ThreadOne   with      Normal priority has a count =   755,897,581
//    ThreadThree with AboveNormal priority has a count =   778,099,094
//    ThreadTwo   with BelowNormal priority has a count =     7,840,984
Imports System.Threading
Imports Timers = System.Timers

Public Module Example
   Dim t As Timers.Timer
   Private priorityTest As New PriorityTest()

    Public Sub Main()
        Dim thread1 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread1.Name = "ThreadOne"
        Dim thread2 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread2.Name = "ThreadTwo"
        thread2.Priority = ThreadPriority.BelowNormal
        Dim thread3 As New Thread(AddressOf priorityTest.ThreadMethod)
        thread3.Name = "ThreadThree"
        thread3.Priority = ThreadPriority.AboveNormal
        thread1.Start()
        thread2.Start()
        thread3.Start()

        ' Allow threads to execute for about 10 seconds.
        t = New Timers.Timer()
        t.AutoReset = False
        t.Interval = 10000
        AddHandler t.Elapsed, AddressOf Elapsed
        t.Start()
    End Sub

    Private Sub Elapsed(sender As Object, e As Timers.ElapsedEventArgs)
       priorityTest.LoopSwitch = False
    End Sub
End Module

Public Class PriorityTest
    Private Shared loopSwitchValue As Boolean
    <ThreadStatic> Shared threadCount As Long

    Sub New()
        loopSwitchValue = True
    End Sub

    WriteOnly Property LoopSwitch As Boolean
        Set
            loopSwitchValue = Value
        End Set
    End Property

    Sub ThreadMethod()
        Do While True
            threadCount += 1
            If Not loopSwitchValue Then Exit Do
        Loop

        Console.WriteLine("{0,-11} with {1,11} priority " &
            "has a count = {2,13}", Thread.CurrentThread.Name,
            Thread.CurrentThread.Priority.ToString(),
            threadCount.ToString("N0")) 
    End Sub
End Class
' The example displays the following output:
'    ThreadOne   with      Normal priority has a count =   755,897,581
'    ThreadThree with AboveNormal priority has a count =   778,099,094
'    ThreadTwo   with BelowNormal priority has a count =     7,840,984

注釈

ThreadPriority は、スレッドの優先度に使用できるすべての値のセットを定義します。ThreadPriority defines the set of all possible values for a thread priority. スレッドの優先度は、スレッド間の相対的な優先度を指定します。Thread priorities specify the relative priority of one thread versus another.

すべてのスレッドに優先度が割り当てられます。Every thread has an assigned priority. ランタイム内で作成されたスレッドには、最初に Normal 優先順位が割り当てられますが、ランタイムの外部で作成されたスレッドは、ランタイムに入るときに以前の優先順位を保持します。Threads created within the runtime are initially assigned the Normal priority, while threads created outside the runtime retain their previous priority when they enter the runtime. スレッドの Priority プロパティにアクセスすることによって、スレッドの優先順位を取得および設定できます。You can get and set the priority of a thread by accessing its Priority property.

スレッドの実行は、優先度に基づいてスケジュールされます。Threads are scheduled for execution based on their priority. スレッドの実行順序の決定に使用されるスケジューリング アルゴリズムは、オペレーティング システムによって異なります。The scheduling algorithm used to determine the order of thread execution varies with each operating system. オペレーティングシステムは、ユーザーインターフェイスのフォーカスがフォアグラウンドとバックグラウンドの間を移動するときに、スレッドの優先順位を動的に調整することもできます。The operating system can also adjust the thread priority dynamically as the user interface's focus is moved between the foreground and the background.

スレッドの優先度は、スレッドの状態には影響しません。スレッドの状態は、オペレーティングシステムでスケジュールできるようになる前に Running される必要があります。The priority of a thread does not affect the thread's state; the state of the thread must be Running before the operating system can schedule it.

適用対象

こちらもご覧ください