Callableインターフェースを利用してマルチスレッドを実現


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       :    !