当前位置: 首页 > 编程笔记 >

Java编程中线程池的基本概念和使用

郭辉
2023-03-14
本文向大家介绍Java编程中线程池的基本概念和使用,包括了Java编程中线程池的基本概念和使用的使用技巧和注意事项,需要的朋友参考一下

1 引入线程池的原因
  由于线程的生命周期中包括创建、就绪、运行、阻塞、销毁阶段,当我们待处理的任务数目较小时,我们可以自己创建几个线程来处理相应的任务,但当有大量的任务时,由于创建、销毁线程需要很大的开销,运用线程池这些问题就大大的缓解了。

2 线程池的使用
  我们只需要运用Executors类给我们提供的静态方法,就可以创建相应的线程池:

  public static ExecutorSevice newSingleThreadExecutor()

  public static ExecutorSevice newFixedThreadPool()

  public static ExecutorSevice newCachedThreadPool()

  newSingleThreadExecutor返回以个包含单线程的Executor,将多个任务交给此Exector时,这个线程处理完一个任务后接着处理下一个任务,若该线程出现异常,将会有一个新的线程来替代。

  newFixedThreadPool返回一个包含指定数目线程的线程池,如果任务数量多于线程数目,那么没有没有执行的任务必须等待,直到有任务完成为止。

  newCachedThreadPool根据用户的任务数创建相应的线程来处理,该线程池不会对线程数目加以限制,完全依赖于JVM能创建线程的数量,可能引起内存不足。

  我们只需要将待执行的任务放入run方法中即可,将Runnable接口的实现类交给线程池的execute方法,作为它的一个参数,如下所示:

Executor executor = Executors.newSingleThreadExecutor();
executor.execute(new Runnable(){
  public void run(){
    //执行的任务  
 }
}

  如果需要给任务传递参数,可以通过创建一个Runnable接口的实现类来完成。

3.实例
(1):newSingleThreadExecutor
MyThread.java

publicclassMyThread extends Thread {
  @Override
  publicvoid run() {
    System.out.println(Thread.currentThread().getName() + "正在执行。。。");
  }
}
TestSingleThreadExecutor.java
publicclassTestSingleThreadExecutor {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors. newSingleThreadExecutor();
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果

pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-1正在执行。。。

(2):newFixedThreadPool
TestFixedThreadPool.Java

publicclass TestFixedThreadPool {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newFixedThreadPool(2);
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果

pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-2正在执行。。。
pool-1-thread-1正在执行。。。

(3): newCachedThreadPool
TestCachedThreadPool.java

publicclass TestCachedThreadPool {
  publicstaticvoid main(String[] args) {
    //创建一个可重用固定线程数的线程池
    ExecutorService pool = Executors.newCachedThreadPool();
    //创建实现了Runnable接口对象,Thread对象当然也实现了Runnable接口
    Thread t1 = new MyThread();
    Thread t2 = new MyThread();
    Thread t3 = new MyThread();
    Thread t4 = new MyThread();
    Thread t5 = new MyThread();
    //将线程放入池中进行执行
    pool.execute(t1);
    pool.execute(t2);
    pool.execute(t3);
    pool.execute(t4);
    pool.execute(t5);
    //关闭线程池
    pool.shutdown();
  }
}

输出结果:

pool-1-thread-2正在执行。。。
pool-1-thread-4正在执行。。。
pool-1-thread-3正在执行。。。
pool-1-thread-1正在执行。。。
pool-1-thread-5正在执行。。。

(4):newScheduledThreadPool
TestScheduledThreadPoolExecutor.java

publicclass TestScheduledThreadPoolExecutor {
  publicstaticvoid main(String[] args) {
    ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);
    exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间就触发异常
           @Override
           publicvoid run() {
              //throw new RuntimeException();
              System.out.println("================");
           }
         }, 1000, 5000, TimeUnit.MILLISECONDS);
    exec.scheduleAtFixedRate(new Runnable() {//每隔一段时间打印系统时间,证明两者是互不影响的
           @Override
           publicvoid run() {
              System.out.println(System.nanoTime());
           }
         }, 1000, 2000, TimeUnit.MILLISECONDS);
  }
}

输出结果

================
8384644549516
8386643829034
8388643830710
================
8390643851383
8392643879319
8400643939383
 类似资料:
  • 学习并发编程之前我们需要脑补几个基础知识和思考一个问题 什么是串行? 什么是并行? 什么是并发? 什么是程序? 什么是进程? 什么是线程? 什么是协程? 什么是串行? 串行就是按顺序执行,就好比银行只有1个窗口,有3个人要办事,那么必须排队,只有前面的人办完走人,才能轮到你 在计算机中, 同一时刻,只能有一条指令,在一个CPU上执行,后面的指令必须等到前面指令执行完才能执行,就是串行 什么是并行?

  • 本文向大家介绍Java线程安全基础概念解析,包括了Java线程安全基础概念解析的使用技巧和注意事项,需要的朋友参考一下 Java线程安全初步了解。JAVA线程安全从总体上来说,是指Java对象在多线程运行环境下的一种特性,表现为常规(区别于特殊调用情况)情况下每次调用都能得到正确的逻辑结果。从本质上来说,将对象的方法行为加上了同步控制逻辑,而调用者无须做其他额外的同步控制就可以安全放心的使用对象。

  • 主要内容:1 什么是Java网络,2 Java网络的优势,3 Java网络术语,4 java.net包1 什么是Java网络 Java网络是将两个或多个计算设备连接在一起以便我们可以共享资源的概念。 Java Socket(套接字)编程提供了在不同计算设备之间共享数据的功能。 2 Java网络的优势 共享资源 集中软件管理 3 Java网络术语 下面给出了广泛使用的Java网络术语: IP地址 协议 端口号 MAC地址 面向连接和无连接协议 Socket 3.1 IP地址 IP地址是分配给网络节

  • 1. 线程的概念 我们知道,进程在各自独立的地址空间中运行,进程之间共享数据需要用mmap或者进程间通信机制,本节我们学习如何在一个进程的地址空间中执行多个线程。有些情况需要在一个进程中同时执行多个控制流程,这时候线程就派上了用场,比如实现一个图形界面的下载软件,一方面需要和用户交互,等待和处理用户的鼠标键盘事件,另一方面又需要同时下载多个文件,等待和处理从多个网络主机发来的数据,这些任务都需要一

  • 第 1 章 程序的基本概念 目录 1. 程序和编程语言 2. 自然语言和形式语言 3. 程序的调试 4. 第一个程序

  • 一 单层神经网络(感知器) 1.结构 下面来说明感知器模型。 在原来MP模型的“输入”位置添加神经元节点,标志其为“输入单元”。其余不变,于是我们就有了下图:从本图开始,我们将权值w1, w2, w3写到“连接线”的中间。 图1 单层神经网络 在“感知器”中,有两个层次。分别是输入层和输出层。输入层里的“输入单元”只负责传输数据,不做计算。输出层里的“输出单元”则需要对前面一层的输入进行计算。 我