方式一:继承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(); } }
使用线程池方便管理,节约了每次创建销毁线程的开销。
原文:https://www.cnblogs.com/chigejuzhi/p/14369842.html