在 Java 中,有多种方式来实现多线程。继承 Thread 类、实现 Runnable 接java
口、使用 ExecutorService、Callable、Future 实现带返回结果的多线程。多线程
继承Thread ide
Thread 类本质上是实现了 Runnable 接口的一个实例,表明一个线程的实例。spa
启动线程的惟一方法就是经过 Thread 类的 start()实例方法。start()方法是一个线程
native 方法,它会启动一个新线程,并执行 run()方法。这种方式实现多线程很orm
简单,经过本身的类直接 extend Thread,并复写 run()方法,就能够启动新线继承
程并执行本身定义的 run()方法。接口
/** * @auther: tianweichang * @date: 2018/8/28 20 * @Description: 继承Thread */ public class MyThread extends Thread { public void run() { System.out.println("MyThread.run()"); } public static void main(String[] args) { MyThread myThread1 = new MyThread(); MyThread myThread2 = new MyThread(); myThread1.start(); myThread2.start(); } }
实现Runnable ip
java单线程的问题,若是本身的类已经 extends 另外一个类,就没法直接 extends Thread,此时,能够实现一个 Runnable 接口ci
实现Callable接口经过FutureTask包装器来建立
Thread 线程
有的时候,咱们可能须要让一步执行的线程在执行完成之后,提供一个返回值
给到当前的主线程,主线程须要依赖这个值进行后续的逻辑处理,那么这个时
候,就须要用到带返回值的线程了。Java 中提供了这样的实现方式
/** * @auther: tianweichang * @date: 2018/8/28 20 * @Description: 实现Callable建立线程 */ public class MyCallable implements Callable<String> { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadExecutor(); MyCallable callableDemo = new MyCallable(); Future<String> future = executorService.submit(callableDemo); System.out.println("返回值:" + future.get());//get是阻塞的 executorService.shutdown(); } @Override public String call() throws Exception { //do your business int a = 1; int b = 2; System.out.println(a + b); return "执行结果:" + (a + b); } }