• Java 线程池:

    • ThreadPoolExecutor,创建此线程池的方法:

      • new
      • Executors.newCachedThreadPool():尽量避免使用,其无法控制线程数量,
    • ScheduledThreadPoolExecutor:定时执行;

1. Thread

  • Thread.yield():静态方法,其实对线程调度器(Java 线程机制的一部分,可将 CPU 从一个线程转移到另一个线程),意在告诉编译器“我已经执行完生命周期中最重要的部分了,此刻正是切换给其他嗷嗷待哺的任务执行一段时间的大好机会”。
  • 将 Runnable 对象提交给 Thread 构造器,使用 Thread 对象来驱动 Runnable 对象的执行;

    public class Liftoff implements Runnable{}
    
    // 不使用 Thread 的驱动方式
    public class MainThread {
    public static void main(String[] args) {
    Liftoff launch = new Liftoff();
    launch.run();
    }
    } // 使用 Thread 的驱动方式
    public class BasicThread {
    public static void main(String[] args) {
    Threaad t = new Thread(new Liftoff());
    t.start();
    }
    }

2. Executor

java.util.concurrent 包中的 Executor(执行器,Java SE5 以后)用于管理 Thread 对象,以简化并发编程。

Executor 在客户端和任务执行之间提供了一个间接层。

public class CachedThreadPool {
public static void main(Srting[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 5; ++i) {
exec.execute(new Liftoff());
}
exec.shutdown();
}
}

3. 线程池:不使用线程池与使用线程池

  • 使用线程池

    ThreadPoolExecutor tp = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,
    new LinkedBlockingQueue<Runnable>(COUNT));
    for (int i = 0; i < COUNT; ++i)
    {
    tp.executor(new Runnable(){
    @Override
    public void run() {
    ....
    }
    });
    }
  • 不使用线程池

    for (int i = 0; i < COUNT; ++i)
    {
    Thread thread = new Thread(){
    @Override
    public void run(){
    ...
    }
    }
    thread.start();
    }

使用线程池与不使用线程池的显著差异就在于,使用线程池的方式是复用线程的,而不使用线程池则需要每次都创建新的线程,在一个循环中不断地创建对象,显然是一件效率底下的事情。

4. 使用 ThreadPoolExecutor 创建线程池而非 Executors.newCachedThreadPool()

Java 中创建线程池,除了 ThreadPoolExecutor,还有定时的线程池 ScheduledPoolExecutor。需要注意的是对于 Executors.newCachedThreadPool() 方法返回的线程池的使用,该方法返回的线程池是没有线程上限的,使用时需要格外的小心,因为没有方法控制总体的线程数量,而每个线程都是消耗内存的,这可能会导致过多的内存占用。建议不要使用这个方法返回的线程池,而是使用固定线程上限的线程池。

Java 并发 —— Thread、Executor、线程池的更多相关文章

  1. Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  2. Java并发编程:线程池的使用(转)

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  3. Java并发编程:线程池的使用(转载)

    转载自:https://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  4. Java并发编程:线程池的使用(转载)

    文章出处:http://www.cnblogs.com/dolphin0520/p/3932921.html Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实 ...

  5. [转]Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  6. 【转】Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  7. 13、Java并发编程:线程池的使用

    Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了, ...

  8. (转)Java并发编程:线程池的使用

    背景:线程池在面试时候经常遇到,反复出现的问题就是理解不深入,不能做到游刃有余.所以这篇博客是要深入总结线程池的使用. ThreadPoolExecutor的继承关系 线程池的原理 1.线程池状态(4 ...

  9. Java并发编程之线程池及示例

    1.Executor 线程池顶级接口.定义方法,void execute(Runnable).方法是用于处理任务的一个服务方法.调用者提供Runnable 接口的实现,线程池通过线程执行这个 Runn ...

  10. Java并发编程:线程池ThreadPoolExecutor

    多线程的程序的确能发挥多核处理器的性能.虽然与进程相比,线程轻量化了很多,但是其创建和关闭同样需要花费时间.而且线程多了以后,也会抢占内存资源.如果不对线程加以管理的话,是一个非常大的隐患.而线程池的 ...

随机推荐

  1. 反连接NOT EXISTS子查询中有or 谓词连接条件SQL优化一例

    背景 今天在日常数据库检查中,发现一SQL运行时间特别长,于是抓取出来,进行优化. 优化前: 耗时:503s 返回:0 SQL代码 SELECT * FROM MM_PAYABLEMONEY_TD P ...

  2. Linux中CentOS网络配置以及与Xshell建立远程连接

    为centos配置网络 (1)第一步 点开虚拟机的设置,如下图做相关的设置: 网络连接要选择桥接模式,其他的勾选就按照上图的即可,勾选完成点击确定. (2)第二步 点击VMware的编辑选项,找到“虚 ...

  3. PHP程序员必须知道的两种日志

    前言 作为一名程序员,比码代码还重要那么一点点的东西就是日志的分析和查询.下面列出常见日志及设置方法. php-fpm 慢日志 php慢日志需要在php-fpm.conf设置,如果使用源码包安装默认请 ...

  4. 第二周习题F

    Starting with x and repeatedly multiplying by x, we can compute x31 with thirty multiplications: x2  ...

  5. 【05】emmet系列之各种缩写

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 各种缩写   缩写:! & ...

  6. POJ-20407Relatives/NYOJ-333mdd的烦恼,欧拉函数简单应用,模板A

     poj                         Relatives                                Time Limit: 1000MS   Memory Li ...

  7. bzoj 1049 [HAOI2006]数字序列

    [bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...

  8. Quartz.net框架使用

    概述:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...

  9. PatentTips - Hierarchical RAID system including multiple RAIDs

    BACKGROUND OF THE INVENTION The present invention relates to a storage system offering large capacit ...

  10. linux 磁盘阵列

    1.独立磁盘冗余阵列 (RAID) 2.RAID级别: raid0 扩展卷 (条带卷) 至少一块硬盘 具有较高的存储性能 数据请求多块硬盘并行应答 连续数据分散到多个磁盘存储 ,一块磁盘坏掉所有文件就 ...