Callableインターフェースを利用してマルチスレッドを実現
1455 ワード
Javaでは、マルチスレッドコードを実現するには、二つの方法があります。一つは、Threadクラスを継承することです。もう一つはRunnableインターフェースを実現することです。ただし、Thread類の継承は資源共有ができず、Runnableインターフェースの実現は資源共有が可能です。しかし、Runnableインターフェースで実現されたマルチスレッドは、Runnableインターフェースのrun()メソッドが操作結果に戻ることができないという問題があります。この時は新しいインターフェースを使います。java.util.co ncurrent.rable。以下のとおりです
実行結果:
package book;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
class MyThread implements Callable{
private int ticket=5;
public String call() throws Exception{
for(int i=0;i<100;i++) {
if(this.ticket>0) {
System.out.println(" :ticket="+this.ticket--);
}
}
return " !";
}
}
public class JiOu {
public static void main(String args[]) throws Exception{
MyThread mt1=new MyThread();
MyThread mt2=new MyThread();
FutureTasktask1=new FutureTask(mt1);
FutureTasktask2=new FutureTask(mt2);
new Thread(task1).start();
new Thread(task2).start();
System.out.println("A :"+task1.get());
System.out.println("B :"+task2.get());
}
}
上記では、Java.util.co ncurrent.FutureTask()クラスも用いて、Callableインターフェースオブジェクトのインスタンスを受信し、Futureインターフェース内のget()方法を利用して、call()方法の戻り値を受信することができる。実行結果:
:ticket=5
:ticket=4
:ticket=3
:ticket=2
:ticket=5
:ticket=1
:ticket=4
:ticket=3
:ticket=2
:ticket=1
A : !
B : !