public static void main(String[] args) throws ExecutionException, InterruptedException {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程的第二种开启方式");
}
});
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable中的run方法执行了");
}
};
//线程开启的第三种方式
Callable<Date> callable = new Callable() {
@Override
public Date call() throws Exception {
for (int i = 0; i < 4; i++) {
System.out.println(Thread.currentThread().getName()+i);
}
return new Date();
}
};
//创建线程池对象
ExecutorService ex = Executors.newFixedThreadPool(3);
//ex.execute()此方法只能传入runnable接口
Future<Date> s = ex.submit(callable);
//获取call方法中的返回值
Date date = s.get();
System.out.println("callable中的返回值:"+date);
//获取runnable方法中的返回值
Future<?> s1 = ex.submit(runnable);
Object o = s1.get();
System.out.println("runnable接口中的返回值"+o);
//关闭线程池
ex.shutdown();
}
第一种方式:编写一个类,直接继承java.lang.Thread 重写run方法
第二种方式,编写一个类实现java.lang.Runnable接口
第三种 Callable
->为了提高效率
Runnble 中 run 没有返回值
而call有返回值