Javaでマルチスレッド

JavaGUIを触っていて、重めの処理をしたときにGUIが固まってしまい、

処理がおわるまで反応しなくなったことがありました。

これを避けるには、処理を別スレッドにすれば良いということで、

マルチスレッド化をしましたので、それについて少しメモしておきます。

現在のスレッドと別のスレッドを用意して処理させるには、基本的に以下を書けばよいです。

GUIのクラス内の処理】

  Test test = new Test();

  Thread thread = new Thread(test);

  thread.start();

【重い処理を記述するクラス】

public Test implements Runnable{

  ...

  public void run(){

  hogehoge(); //何か重い処理

  }

  

  private void hogehoge(){

    ...

  }

}

何をやっているのかというと、GUIクラスでは

Thread thread = new Thread(test)

の箇所で、Testクラスのインスタンスtestを使って、threadという新たなスレッドを作り、

thread.start();

で、test.run()をスレッドthread内で動かしています。

Testクラスでは、run()の中に、別スレッドで行わせたい処理hogehoge()を書いておき、

Runnableというインターフェースをimplements しておきます。

こうすることで、重い処理であるhogehoge()を別スレッドで呼び出すことができるため、

GUIが固まることを回避できます。

上記ではGUIクラスから別スレッドを呼び出しましたが、

当然ながら、GUIクラスを別スレッドとして生成してもよいでしょう。

また、わざわざ別クラスを用意するほどでもなかったりする場合、

以下のようにRunnable()クラスのインスタンスを作って、直接処理を記述することも可能です。

Thread thread = new Thread(new Runnable(){

  public void run(){ hogehoge(); }

});

thread.start();