java三种实现线程的方法比较
1.继承Thread
2.实现Runnable
1和2的比较,1可以创建不同的任务,每个任务互不干扰,对于2,相当于只执行一个任务,多个任务之间互相影响,比如售票系统,每售出一张票,票数都要减1,这个时候应该用runnable,因为当其操控的是一个实例的时候,所有实现runable的类共用这个实例资源,而runnable还有一个好处,就是有时候需要继承某个类的时候,Thread无法做到,因为它不能多继承,而runnable却可以。
import java.util.concurrent.Callable; public class MyCallable implements Callable<Integer>{ @Override public Integer call() throws Exception { int i=0; for(;i<10;i++){ Thread.sleep(10000); System.out.println(i); } return i; } } import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.FutureTask; public class Test { public static void main(String[] args){ MyCallable myCallable=new MyCallable(); FutureTask<Integer> ft=new FutureTask<>(myCallable); //方式一:采用线程池来调用线程 ExecutorService es=Executors.newCachedThreadPool(); es.submit(ft); es.shutdown(); //方式二:采用Thread单任务模式启动线程 // new Thread(ft).start(); } }
如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。