方式一:继承Thread类,并重写run方法

注意:开启线程要使用start()方法,run()方法只是普通的方法调用。

实际上的创建线程还是通过本地方法,Java本身并不能开启线程。

方式二:实现Runnable接口,并重写run方法

注意:这里要通过Thread对象来开启线程。

方式三:实现Callable接口,并重写call方法

注意:因为要通过Thread对象来开启线程,上面给出了Thread类的构造方法,没有直接的方法可以传入Callable,所以我们要对其进行加功。而Callable又是特别的,它可以有返回值。所以提供了一个FutureTask类,通过它可以获取返回的结果。且它间接实现了Runnable接口,所以可以传入Thread的构造函数。如下:

 方式四:通过线程池创建

package orange;


import java.util.concurrent.*;

public class MyThread4 {
    public static void main(String[] args) {
        /**
         * 高速缓存的线程池,需要多少创建多少,60s未调用就会自动销毁。
         *                              ThreadPoolExecutor(0, Integer.MAX_VALUE,
         *                                               60L, TimeUnit.SECONDS,
         *                                               new SynchronousQueue<Runnable>())
         */
        ExecutorService executorService = Executors.newCachedThreadPool();

        /**
         *  固定大小的线程池,满了就等待
         *                             ThreadPoolExecutor(nThreads, nThreads,
         *                                               0L, TimeUnit.MILLISECONDS,
         *                                               new LinkedBlockingQueue<Runnable>())
         */
        ExecutorService executorService1 = Executors.newFixedThreadPool(10);

        /**
         * 每次只创建一个线程,满了就等待
         *                              new ThreadPoolExecutor(1, 1,
         *                                             0L, TimeUnit.MILLISECONDS,
         *                                             new LinkedBlockingQueue<Runnable>()))
         */
        ExecutorService executorService2 = Executors.newSingleThreadExecutor();

        /**
         * 自定义线程池
         *         ThreadPoolExecutor(int corePoolSize,    //核心线程数
         *                                       int maximumPoolSize,   //最大线程数
         *                                       long keepAliveTime,    //非核心线程空闲时的存活时间
         *                                       TimeUnit unit,         //存活时间单位
         *                                       BlockingQueue<Runnable> workQueue, //阻塞队列,也就是等着获取线程的
         *                                       ThreadFactory threadFactory,   //线程工厂
         *                                       RejectedExecutionHandler handler)  //拒绝策略,默认为AbortPolicy()
         */
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10,
                20L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

        executorService.execute(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "线程执行了");
            }
        });
        executorService1.execute(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "线程执行了");
            }
        });
        executorService2.execute(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "线程执行了");
            }
        });

        threadPoolExecutor.execute(new Runnable() {
            public void run() {
                System.out.println(Thread.currentThread().getName() + "线程执行了");
            }
        });
        executorService.shutdown();
        executorService1.shutdown();
        executorService2.shutdown();
        threadPoolExecutor.shutdown();
    }
}