java多线程

多线程的实现方式

        自定义类继承thread类

            重写run()方法,创建自定义类对象,调用start()方法

            优缺点: 开多个线程需要new多个对象,每一个类的成员变量都一样,需要在栈中开辟很多内存

        自定义类实现runnable接口 

            重写run()方法, 创建自定义类对象, 创建thread对象,使用自定义类多少作为构造参数,调用start()方法

            优缺点: 自定义一个对象,new多个thread对象

为什么要重写run()方法?

        run()方法里面封装的是线程执行的代码。

run()方法和start()方法的区别?

        run()方法直接调用仅仅是普通方法

        start()方法是先启动一个新的线程,再有jvm去调用run()方法


Executors创建线程池

Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThreads),但是便捷不仅隐藏了复杂性,也为我们埋下了潜在的隐患(OOM,线程耗尽)。

newFixedThreadPool(int nThreads)    创建固定大小的线程池

newSingleThreadExecutor()                创建只有一个线程的线程池

newCachedThreadPool()                    创建一个不限线程数上限的线程池,任何提交的任务都将立即执行

小程序使用这些快捷方法没什么问题,对于服务端需要长期运行的程序,创建线程池应该直接使用ThreadPoolExecutor的构造方法

// Java线程池的完整构造函数

publicThreadPoolExecutor(

        intcorePoolSize, // 线程池长期维持的线程数,即使线程处于Idle状态,也不会回收。

        intmaximumPoolSize, // 线程数的上限

        longkeepAliveTime, TimeUnit unit, // 超过corePoolSize的线程的idle时长, 

                                                                 // 超过这个时间,多余的线程会被回收。 

         BlockingQueue workQueue, // 任务的排队队列 

         ThreadFactory threadFactory, // 新线程的产生方式 

         RejectedExecutionHandler handler)// 拒绝策略

corePoolSize和maximumPoolSize设置不当会影响效率,甚至耗尽线程;

workQueue设置不当容易导致OOM;

handler设置不当会导致提交任务时抛出异常。

可以向线程池提交的任务有两种:Runnable和Callable

Callable允许有返回值,允许抛出异常

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.1 并发与并行 并行:指两个或多个时间在同一时刻发生(同时发生)并发:值两个或多个时间在同一时间段内发生在操作...
    阿麽阅读 533评论 0 0
  • 多线程主要技术进程与线程线程状态阻塞状态分类线程的调度常用函数说明Thread类方法创建线程线程池线程安全向线程传...
    小石头呢阅读 1,418评论 3 15
  • 引言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要...
    冰薄荷汽水阅读 271评论 1 0
  • 线程池ThreadPoolExecutor corepoolsize:核心池的大小,默认情况下,在创建了线程池之后...
    irckwk1阅读 795评论 0 0
  • Java 多线程 多线程:指的是这个程序(一个进程)运行时产生了不止一个线程 并行与并发: 并行:多个cpu实例或...
    编程小世界阅读 143评论 0 0