实现java的多线程操作 —— 实现Callable接口
在java中,对于多线程实现一定要有一个线程的主类,而这个线程的主类往往是需要操作一些资源。但是对于这个多线程主类的实现是有一定要求的:
1.继承Thread父类;
2.实现Runnable接口(Callable接口)
1.1实现Callable接口
从JDK1.5之后对于多线程的实现多了一个Callable接口,从这个接口里面比Runnable接口唯一强大之处在他可以返回执行结果。此接口定在java.util.concurrent包中。
@FunctionalInterface
public interface Callable<V>{
public V call() throws Exception{
}
}
这个泛型表示的是返回值类型,call()方法就相当于run()方法。
范例:利用Callable定义一个线程的主体类
class MyThread implements Callable<String> {//表示实现多线程
private int ticket = 5;
@Override
public String call() {//覆写call(),线程的主方法
for(int i = 0;i < 10;i++){
if(this.ticket >0){
System.out.println("卖票,ticket = " + this.ticket--);
}
}
return "票卖完了";
}
}
但是现在出现了一个问题,Thread类中并没有提供接受Callable接口的对象操作,所以现在如何启动多线程就出现了问题。为了分析出启动的操作,需要来观察继承结构。
package day1;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
class MyThread implements Callable<String> {//表示实现多线程
private int ticket = 5;
@Override
public String call() throws Exception{//覆写call(),线程的主方法
for(int i = 0;i < 10;i++){
if(this.ticket >0){
System.out.println("卖票,ticket = " + this.ticket--);
}
}
return "票卖完了";
}
}
public class TestThreadDemo {
public static void main(String[] args) throws Exception {
Callable<String> call = new MyThread();//泛型接口实现吗,模式
FutureTask<String> task = new FutureTask<>(call);//取得执行结果,并放在Thread类中
Thread thread = new Thread(task);
thread.start();
System.out.println(task.get());//取得线程主方法返回值
}
}
卖票,ticket = 5
卖票,ticket = 4
卖票,ticket = 3
卖票,ticket = 2
卖票,ticket = 1
票卖完了
1.2 总结
- Thread 有单继承局限所以不使用,但是所有的线程对象一定要通过Thread里中的star()方法启动;
- Runnable使用可以避免单继承局限,建议使用此操作;
- Callable比Runnable唯一的好处是多了返回值的数据