blog

IntelliJ IDEAでマルチスレッドの同時実行コードをデバッグする

一般的に、マルチスレッドの同時実行と条件付きブレークポイントのデバッグは困難です。マルチスレッド開発中のデバッグをより的を絞ったものにしましょう。\n\n数学が苦手な方はこちらを見てください。...

Oct 18, 2020 · 3 min. read
シェア

一般的に、マルチスレッドの同時実行や条件付きブレークポイントのデバッグは困難です。マルチスレッド開発中のデバッグをより的を絞ったものにしましょう。

これは例題を通して学びます。ここでは、100!+100000という数学の問題を計算するマルチスレッドプログラムを書きました!つまり、100の階乗+100000の階乗です。

数学が苦手な方のために、100階乗は、1 * 2 * 3 * ...... * 100 = ? で、100と略されます!

import java.math.BigInteger;
public class MathProblemSolver {
 //つのスレッドを開く
 public static void main(String arg[]){
 //最初のスレッドは 100!
 FactorialCalculatingThread thread1 = new FactorialCalculatingThread(100);
 //番目のスレッドは、次のように計算する。 !
 FactorialCalculatingThread thread2 = new FactorialCalculatingThread();
 thread1.setName("Thread 1");
 thread2.setName("Thread 2");
 thread1.start();
 thread2.start();
 try {
 thread1.join(); //スレッド・ジョンは、「スレッド1」と「スレッド2」の両方が結果を返した場合、メイン・スレッドがそれ以上実行しないようにする。
 thread2.join();
 } catch (InterruptedException e) {
 e.printStackTrace();
 }
 BigInteger result = thread1.getResult().add(thread2.getResult());
 System.out.println("2つのスレッドの結果を足すことは、等しい:" + result);
 }
 //階乗計算のスレッドクラス
 private static class FactorialCalculatingThread extends Thread {
 private BigInteger result = BigInteger.ONE;
 private long num;
 public FactorialCalculatingThread(long num) {
 this.num = num;
 }
 @Override
 public void run() {
 System.out.println(Thread.currentThread().getName() + " 階乗計算を開始する:" + num);
 factorialCalc(num);
 System.out.println(Thread.currentThread().getName() + "実行完了");
 }
 //数値の階乗を計算する
 public void factorialCalc(long num) {
 BigInteger f = new BigInteger("1");
 for (int i = 2; i <= num; i++)
 f = f.multiply(BigInteger.valueOf(i));
 result = f;
 }
 public BigInteger getResult() { return result; }
 }
}

上記のコードでは

  • スレッド1 "の計算と "スレッド2 "の計算(100000!)の2つのスレッドを開いてください。
  • main()メソッドで2つのスレッドを起動し、thread1.join()とthread2.join()を呼び出して、"thread1 "と "thread2 "の両方が結果を返したときにメイン・スレッドがそれ以上実行されないようにします。
  • 最後に、2つのスレッドからの計算結果が加算され、100!+100000となります!

IntelliJ IDEAツールを使って、このマルチスレッド・コードをデバッグしてみましょう。

フレームとThreadパネル

デバッグツールウィンドウにはドロップダウンメニューがあります。これは、ブレークポイントによって一時停止しているスレッドに焦点を当て、それらのスレッドのコールスタック情報を表示します。次の図では、ブレークポイントは図の位置の main() メソッドにあり、Frame にはメインスレッドのコールスタックが表示されています。

他のスレッドのコールスタックを確認したい場合は、ドロップダウンリストから選択できます。

条件付きブレークポイント - 条件に一致するスレッドのみをハングします。

私がプログラムのバグを解決していて、"Thread 2 "が実行を開始したときだけ実行を一時停止する必要があるとします。つまり、FactorialCalculatingThreadのrun()メソッドの最初の行にブレークポイントを追加する必要があります。オープンされた2つのスレッドは同じコード片を使用しているので、問題があります - そのコード片を使用しているすべてのスレッドは、アプリケーションの "スレッド1 "と "スレッド2 "を含め、ブレークポイントにぶつかるとハングします。私は両方のスレッドを停止させたくありません。どうすればいいでしょうか?

条件付きブレークポイント機能を使うことができます。ブレークポイントを追加したら、その上で右クリックし、"suspend "を選択し、"Thread "を選択します。100! + !次に、次のスクリーンショットのように条件を追加します。この条件により、デバッガは現在のスレッドの名前が "Thread 2" の場合のみサスペンドするようになります:

ここでデバッガを実行し、アプリケーションがサスペンドされると、「スレッド 2」だけがサスペンドされます。スレッド1」が実行され、サスペンドされていないことは、以下の手順で確認できます:

1.コンソールで、ログを通して「スレッド1」が実行され、終了したことを確認できます。

2.スレッド "パネルで、この時点で、もはや "スレッド1 "が存在しないことを見ることができます完了しました!

条件付きブレークポイントの設定方法は、IDE のバージョンによって異なります。しかし、重要なことは、これらの機能が存在することを認識し、それを使用することです。

Read next

ローマ数字を10進数に変換する3つの方法

簡単なものから難しいものまで、3つのメソッドに分かれています。しかし、それはすべて暴力的な解決法です。 引き算を構成する文字列を見つけるのは簡単で、まず足し算を終えてから引き算をします。 隣り合うローマ数字は足し算。 隣り合うローマ数字は、左が右より小さい場合、右-左になります。 考え方は方法2と同じですが、アルゴリズムはよりすっきりしています。

Oct 18, 2020 · 3 min read