三种创建方式
一:继承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方法若有异常只能在内部消化。
原创,转载请著名出处!
文章转载于:https://www.jianshu.com/p/a852eab01195
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~