テストスレッドスケジューラ用にJavaで記述できる、簡単に実装できる単一のCPUとメモリを大量に消費する計算が必要です。
それらは少し時間がかかるはずですが、もっと重要なのはリソースを消費することです。
何か案は?
CPUを集中的に使用するタスクの簡単な例:
PDP-11のCPUソークテストはtan(atan(tan(atan(...)))
などでした。FPUはかなりハードに動作し、スタックとレジスタも動作します。
2つの行列を乗算します。マトリックスは巨大で、ディスクに保存されている必要があります。
文字列検索。または、巨大なドキュメントにインデックスを付けます(各単語またはアルファベットの文字列の出現を検出してカウントします)。たとえば、大規模なソフトウェアプロジェクトのソースコード内のすべての識別子にインデックスを付けることができます。
円周率を計算します。
2Dマトリックスまたは画像を回転させます。
いくつかの巨大なファイルを圧縮します。
.。
フィボナッチ数列のn番目の項を計算します。ここでnは70より大きいです。(時間がかかる)
多数の階乗を計算します。 (時間がかかる)
グラフで、2つのノード間のすべての可能なパスを見つけます。 (メモリを消費します)
Javaでスレッドの優先度をいじって、以下のコードを使用しました。スレッドの優先度が違いを生むほどCPUをビジー状態に保っているようです。
@Test
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception {
class MyRunnable implements Runnable {
@Override
public void run() {
for (int i=0; i<1_000_000; i++) {
double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789))))))))));
cbrt(d);
}
LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName());
}
}
final int NUMBER_OF_THREADS = 32;
List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS);
for (int i=1; i<=NUMBER_OF_THREADS; i++) {
Thread t = new Thread(new MyRunnable());
if (i == NUMBER_OF_THREADS) {
// Last thread gets MAX_PRIORITY
t.setPriority(Thread.MAX_PRIORITY);
t.setName("T-" + i + "-MAX_PRIORITY");
} else {
// All other threads get MIN_PRIORITY
t.setPriority(Thread.MIN_PRIORITY);
t.setName("T-" + i);
}
threadList.add(t);
}
threadList.forEach(t->t.start());
for (Thread t : threadList) {
t.join();
}
}