个人简历 网站开发,建筑网库,西安百度搜索排名,个人博客网站怎么建立多线程使用
在java中#xff0c;多线程得主要实现方式有四种#xff1a;继承Thread类#xff0c;实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程#xff0c;使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执…多线程使用
在java中多线程得主要实现方式有四种继承Thread类实现Runnable接口、实现callable接口通过FutureTask包装器来创建Thread线程使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值而后两种是带返回值的。除此之外通过Timer启动定时任务或者通过像Spring Task和quartz这样的第三方任务调度框架也可以开启多线程任务
继承Thread类创建线程
Thread类本质上也是实现了Runnable接口的一个实例代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法它将启动一个新线程并执行run()方法。这种方式实现多线程比较简单通过继承Thread类并复写run()方法就可以启动新线程并执行自己定义的run()方法
public class ThreadDemo extends Thread {public ThreadDemo(String name) {// 设置当前线程的名字this.setName(name);}Overridepublic void run() {System.out.println(当前运行的线程名为 Thread.currentThread().getName());}public static void main(String[] args) throws Exception {// 注意这里要调用start方法才能启动线程不能调用run方法new ThreadDemo(MyThreadOne).start();new ThreadDemo(MyThreadTwo).start();}}
输出结果 当前运行的线程名为 MyThreadOne
当前运行的线程名为 MyThreadTwo 实现Runnable接口创建线程
由于Java是单继承机制如果自己的类已经继承自另一个类则无法再直接继承Thread类此时可以通过实现Runnable接口来实现多线程。
实现Runnable接口并实现其中的run方法然后通过构造Thread实例传入Runnable实现类然后调用Thread的start方法即可开启一个新线程。 public class MyRunnable implements Runnable {Overridepublic void run() {System.out.println(当前运行的线程名为 Thread.currentThread().getName());}public static void main(String[] args) throws Exception {MyRunnable runnable new MyRunnable();new Thread(runnable, MyThreadOne).start();new Thread(runnable, MyThreadTwo).start();}} 输出结果 当前运行的线程名为 MyThreadOne
当前运行的线程名为 MyThreadTwo 线程池使用
线程池本质是池化技术的应用和连接池类似创建连接与关闭连接属于耗时操作创建线程与销毁线程也属于重操作为了提高效率先提前创建好一批线程当有需要使用线程时从线程池取出用完后放回线程池这样避免了频繁创建与销毁线程。
核心参数
线程池的核心参数决定了池的类型进而决定了池的特性。
参数解释行为corePoolSize核心线程数池中长期维护的线程数量不主动回收maximumPoolSize最大线程数最大线程数大于等于核心线程数keepAliveTime线程最大空闲时间非核心线程最大空闲时间超时回收线程workQueue工作队列工作队列直接决定线程池的类型 Executors类默认创建线程池与参数对应关系。 线程池corePoolSizemaximumPoolSizekeepAliveTimeworkQueuenewCachedThreadPool0Integer.MAX_VALUE60SynchronousQueuenewSingleThreadExecutor110LinkedBlockingQueuenewFixedThreadPoolNN0LinkedBlockingQueuenewScheduledThreadPoolNInteger.MAX_VALUE0DelayedWorkQueue 线程池对比
线程池特点适用场景newCachedThreadPool超时未使用的线程回自动销毁有新任务时自动创建适用于低频、轻量级的任务。回收线程的目的是节约线程长时间空闲而占有的资源。newSingleThreadExecutor线程池中有且只有一个线程顺序执行任务newFixedThreadPool线程池中有固定数量的线程且一直存在适用于高频的任务即线程在大多数时间里都处于工作状态。newScheduledThreadPool定时线程池与定时调度相关联
https://segmentfault.com/a/1190000041661118