#继承 java.lang.Thread
public class ExtThreadCreateThread extends Thread { public static void main(String[] args) { new ExtThreadCreateThread("extends-threadClass-thread").start(); } public ExtThreadCreateThread() {} public ExtThreadCreateThread(String name) { super(name); } @Override public void run() { System.out.println("class name [" + this.getClass().getName() + "] , " + "thread name [" + Thread.currentThread().getName() + "]"); }}
#实现 java.lang.Runnable
public class ImplRunnableCreateThread implements Runnable { public static void main(String[] args) { new Thread(new ImplRunnableCreateThread(), "implements-runnable-thread").start(); } @Override public void run() { System.out.println("class name [" + this.getClass().getName() + "] , " + "thread name [" + Thread.currentThread().getName() + "]"); }}
#实现 java.util.concurrent.Callable
public class ImplCallableCreateThread implements Callable{ private static Long count = 10L; public static void main(String[] args) throws ExecutionException, InterruptedException { ImplCallableCreateThread call = new ImplCallableCreateThread(); FutureTask futureTask = new FutureTask<>(call); new Thread(futureTask,"implements-callable-thread").start(); Thread.sleep(200); // 避免 main 线程先执行完 while (futureTask.isDone()) { System.err.println("mission completed return value " + "[" + futureTask.get() + "]"); break; } } @Override public Long call() throws Exception { while (count > 0) { count--; System.out.println("class name [" + this.getClass().getName() + "] , " + "thread name [" + Thread.currentThread().getName() + "]" + ", count [" + count + "]"); } return count; }}
#上述三种方式分析
-
extends java.lang.Thread
** 优点 :直接 new 当前对象调用 start 方法即可开启一个线程,对于初学者来说比较直观。 ** 缺点 : 采用继承这种强耦合性的方式;Java的单继承问题;需要提供和 java.lang.Thread 中对应的构造函数(比如:当创建一个线程的时候最好给线程起一个名字,这样排查问题,监控起来都会方便一些)。这时候就需要提供一个这样的构造函数:
public ExtThreadCreateThread(String name) { super(name); }
-
implements java.lang.Runnable (java.lang.Thread 实现了 Runnable 接口)
** 优点:采用实现接口的方式,类的扩展性更为灵活; ** 缺点 :无法自定义线程执行结束后的返回值类型,事实上 Runnable 接口的 run() 方法的返回值类型是 void。 在一些情况下我们需要得到某个线程正常结束后的一个结果,很显然 Runnable 不能帮助我们完成这件事情。(不过借住 Runnable 的子类 java.util.concurrent.FutureTask 可以完成这个功能)。
-
implements java.util.concurrent.Callable ** 优点 : 可以自定义返回结果;可以抛出经过检查的异常; ** 缺点 :在创建线程的时候需要再去实例化一个 java.util.concurrent.FutureTask 将Callable 交给 FutureTask , 再将 FutureTask (FutureTask 是 Runnable 的子类)交给 Thread。代码如下:
ImplCallableCreateThread call = new ImplCallableCreateThread();FutureTaskfutureTask = new FutureTask<>(call);new Thread(futureTask,"implements-callable-thread").start();