三种创建方式
一:继承Thread方式
class ThreadA extends Thread{
@Override
public void run(){
System.out.println("通过 继承Thread类 方式实现 ")
}
}
二:实现Runnable接口
class ThreadB implements Runnable{
@Override
public void run(){
System.out.println("通过 实现Runnable接口 方式实现 ")
}
}
三:实现Callable接口实现
class ThreadC implements Callable<String>{
@Override
public String call() {
System.out.println("通过 实现Callable接口 方式实现 ")
return "success";
}
}
调用示例
public class ThreadTest{
public static void main(String [] args){
//ThreadA
Thread t1 = new Thread(new ThreadA());
t1.start();
//ThreadB
Thread t2 = new Thread(new ThreadB());
t2.start();
//ThreadC
ThreadC test = new ThreadC();
FutureTask<String> futureTask = new FutureTask<String>(test);
Thread t3 = new Thread(futureTask);
t3.start();
try {
//获取返回call方法结果
String result = futureTask.get(1, TimeUnit.SECONDS);
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
三种创建方式比较
继承创建线程的缺陷是受java单继承的影响,如果一个线程继承了Thread类,就无法继承其他类,不利于业务逻辑处理,并且Thread类其实也是实现了Runnable接口的
Callable和Runnale的区别
1.Runnable执行方法是run(),Callable是call()
2.实现Runnable接口的任务线程无返回值;Callable接口支持返回执行结果,此时需要调用FutureTask.get(long time, TimeUnit unit)方法实现,此方法会阻塞主线程直到获取子线程执行完的结果;当不调用此方法时,主线程不会阻塞
3.call方法可以抛出异常,run方法若有异常只能在内部消化。
原创,转载请著名出处!
网友评论