1. 继承 Thread 类

继承 Thread 类,重写 run() 办法。

在主线程中创立 MyThread 类对象,调用 start() 办法启动线程。

public class ThreadDemo {    public static void main(String[] args) {        MyThread myThread = new MyThread();        myThread.start();    }    static class MyThread extends Thread {        @Override        public void run() {            System.out.println("继承 Thread 创立线程");        }    }

2. 实现 Runnable 接口

创立一个 MyRunnable 外部类实现 Runnable 接口,重写 run() 办法。

在创立 Thread 类对象时传入 MyRunnable 类对象。

也能够不独自写 Runnable 接口的实现类,间接应用 Lambda 表达式实现。

public class ThreadDemo {    public static void main(String[] args) {       //实现 Runnable 接口        Thread t1 = new Thread(new MyRunnable());        t1.start();      //间接应用 Lambda 缩写        new Thread(()->{            System.out.println("用 Lambda 缩写创立线程");        }).start();    }    static class MyRunnable implements Runnable {        @Override        public void run() {            System.out.println("实现 Runnable 接口创立线程");        }    }}

3. 实现 Callable 接口

创立一个 MyCallable 外部类实现 Callable 接口,重写 call() 办法。

FutureTask 实现了 RunnableFuture,RunnableFuture 继承了 Runnable, Future。

意味着可通过 FutureTask 接管 Callable 中 call 办法的返回值。

并和 Runnable 一样,传入 Thread 中创立线程。

futureTask.get() 办法能够失去线程返回后果,然而该办法是阻塞的。

意味着如果 t1 线程始终在运算,main 线程须要始终期待 t1 的完结,拿到后果能力持续运行。

public class ThreadDemo {    public static void main(String[] args) throws ExecutionException, InterruptedException {        FutureTask futureTask = new FutureTask<>(new MyCallable());        Thread t1 = new Thread(futureTask);        t1.start();        //如果 futureTask.get() 没失去后果,代码将始终等着        System.out.println(futureTask.get());        System.out.println("t1 线程执行实现");    }    static class MyCallable implements Callable {        @Override        public Object call() {            System.out.println("实现 Callable 接口创立线程");            return "Callable 返回后果";        }    }}

4. 应用线程池创立

长处:

升高资源耗费。 通过反复利用已创立的线程升高线程创立和销毁造成的耗费。
进步响应速度。 当工作达到时,工作能够不须要等到线程创立就能立刻执行。
进步线程的可管理性。 如果无限度的创立线程,不仅会耗费系统资源,还会升高零碎的稳定性,通过线程池能够进行对立的调配,调优和监控。

public class ThreadDemo {    public static void main(String[] args){        //创立固定 5 个线程的线程池        ExecutorService executorService = Executors.newFixedThreadPool(5);        //用线程池执行 100 次工作        for (int i = 0; i < 100; i++) {            executorService.execute(new Runnable() {                @Override                public void run() {                    System.out.println(Thread.currentThread().getName());                }            });        }    }}