3

関連する質問では、ProcessBuilderを使用して、OSに依存するコマンドを使用して優先度の低い外部プロセスを開始する方法を検討しました。また、親プロセスの優先度が低い場合、生成されたすべてのプロセスが低い優先度で開始されることも発見しました。したがって、私の新しい質問は、Javaファイル(Windowsで実行可能jarをダブルクリックして実行)を低優先度で開始するか、実行中にプログラムで優先度を変更することです。スレッドの優先度を変更しようとしましたが、これはWindowsプロセスの優先度には影響しません。

次のことを試しましたが、タスクマネージャーのプロセスの優先度は変更されません

public class hello{
    public hello(){
        try{
            Thread.currentThread().setPriority(1);
            Thread.sleep(10000);    
        }catch(Exception e){e.printStackTrace();}
    }
}

私が考えることができる他の唯一のことは、バッチファイルを使用してプログラムを実行することですが、いわば家族でこれを維持したいと思います。では、現在のプロセスの優先順位を変更するJavaベースの方法を知っている人はいますか?理想的には、プログラムの実行中にユーザー入力に応じてプロセスの優先度を変更できると便利です。

4

4 に答える 4

6

おそらくあなたはOSがあなたのためにやっていることをやろうとしているのでしょう。

Unixでは、負荷がかかると、各プロセスにその作業を行うための短いタイムスライスが与えられます。すべてのタイムスライスを使用する場合、プロセスはCPUにバインドされていると見なされ、優先度は低くなります。IOでブロックする場合、IOバウンドであると見なされ、優先度が上がります(すべてのタイムスライスを使用しなかったため)

これはすべて、十分なCPUがない場合にのみ問題になります。ほとんどの場合、CPU負荷を100%未満に保つと、すべてのプロセスが必要なだけCPUを取得し、優先順位に大きな違いはありません。

于 2011-06-05T07:33:41.660 に答える
3

https://stackoverflow.com/questions/257859では、Windowsでスレッドの優先度を変更する方法について説明しています。これを行うためのJavaAPIを知らないので、WindowsAPIを呼び出すにはJNIにフォールバックする必要があります。あなたの立場では、関数を簡単にマップできるJNAから始めるか、APIへの既製のJavaラッパーがある場合はそれを見つけることから始めたいと思います。

于 2011-06-04T20:34:03.070 に答える
1

Windows 10の場合でも、非推奨のWMICコマンドを使用して、実行中のプロセスに低い優先度を設定できます。

static void setSelfLowPrio(){
    try {
        Runtime.getRuntime()
                .exec(String.format("wmic process where processid=%d CALL setpriority \"idle\"", ProcessHandle.current().pid()));
    } catch (IOException e) {
        e.printStackTrace();
    }
}

プロセスに「アイドル」では不十分な場合は、「低」または「通常より下」に設定することもできます。

于 2021-11-22T12:54:51.680 に答える
0

(タイトルはウィンドウを具体的に扱っていませんが、タグは扱っています。しかし、違いを知ることは適切かもしれないと思います。)

一般に、スレッドのスケジューリングはプロセスがカーネルに依存する機能であり、これを行うための移植可能な方法はほとんどありません。実際、優先順位の意味は大きく異なります。たとえば、NTでは、24の高い値はリアルタイムを意味し、1の値はアイドルを意味します。UNIXでは、これは逆です。1が最も速く、値が大きいほど遅くなります。

もちろん、Javaは、1(最低)から10(最高.setPriority)の範囲を使用してこの情報を抽象化します。

まだ指摘されていないことですが、多くのUNIXでかなり大きな問題があります。デフォルトでは、ユーザー自身が直前に優先度を下げたとしても、ユーザーはプロセスの優先度を上げることができません(つまり、nice値を下げます)。

NTとは対照的に、優先度をデフォルトの優先度に戻すことができると思います。

簡単に言えば.setPriority、Windowsでは機能する可能性がありますが、UNIXでは機能しない可能性があります。

于 2014-07-02T11:59:23.550 に答える