iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java线程池的实现方法
  • 706
分享到

Java线程池的实现方法

2023-06-17 11:06:30 706人浏览 薄情痞子
摘要

本篇内容主要讲解“Java线程池的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程池的实现方法”吧!以前做的东西,实现一个简单的多线程机制,开始之前,现说说原理性的东西吧,下面

本篇内容主要讲解“Java线程池的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程池的实现方法”吧!

以前做的东西,实现一个简单的多线程机制,开始之前,现说说原理性的东西吧,下面是我在ibm开发者上搜到的内容

线程池的技术背景

面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象, 以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁。如何利用 已有对象来服务就是一个需要解决的关键问题,其实这就是一些"池化资源"技术产生的原因。

多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力。但如果对多线程应用不当,会增加对单个任务的处理时间。可以举一个简单的例子:

假设在一台服务器完成一项任务的时间为T

◆  T1 创建线程的时间

◆ T2 在线程中执行任务的时间,包括线程间同步所需时间

◆ T3 线程销毁的时间

显然T = T1+T2+T3。注意这是一个极度简化的假设。

可以看出T1,T3是多线程本身的带来的开销,我们渴望减少T1,T3所用的时间,从而减少T的时间。但一些线程的使用者并没有注意到 这一点,所以在程序中频繁的创建或销毁线程,这导致T1和T3在T中占有相当比例。显然这是突出了线程的弱点(T1,T3),而不是优点(并发性)。

线程池技术正是关注如何缩短或调整T1,T3时间的技术,从而提高服务器程序性能的。它把T1,T3分别安排在服务器程序的启动和结束的时间段或者一些空闲的时间段,这样在服务器程序处理客户请求时,不会有T1,T3的开销了。

线程池不仅调整T1,T3产生的时间段,而且它还显著减少了创建线程的数目。在看一个例子:

假设一个服务器一天要处理50000个请求,并且每个请求需要一个单独的线程完成。我们比较利用线程池技术和不利于线程池技术的服务器 处理这些请求时所产生的线程总数。在线程池中,线程数一般是固定的,所以产生线程总数不会超过线程池中线程的数目或者上限(以下简称线程池尺寸),而如果 服务器不利用线程池来处理这些请求则线程总数为50000。一般线程池尺寸是远小于50000。所以利用线程池的服务器程序不会为了创建50000而在处 理请求时浪费时间,从而提高效率。

这些都是假设,不能充分说明问题,下面我将讨论线程池的简单实现并对该程序进行对比测试,以说明线程技术优点及应用领域。

一般一个简单线程池至少包含下列组成部分

◆ 线程池管理器(ThreadPoolManager):用于创建并管理线程池

◆ 工作线程(WorkThread): 线程池中线程

◆ 任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。

◆ 任务队列:用于存放没有处理的任务。提供一种缓冲机制。

线程池管理器至少有下列功能:创建线程池,销毁线程池,添加新任务。下面就是小弟的实现,还是欢迎拍砖哈:

public class ThreadPoolManager {      private static ThreadPoolManager instance = null;      private List<Upload> taskQueue = Collections.synchronizedList(new LinkedList<Upload>());//任务队列      private WorkThread[] workQueue ;    //工作线程(真正执行任务的线程)      private static int worker_num = 5;    //工作线程数量(默认工作线程数量是5)      private static int worker_count = 0;            private ThreadPoolManager(){          this(5);      }      private ThreadPoolManager(int num){          worker_num = num;          workQueue = new WorkThread[worker_num];          for(int i=0;i<worker_num;i++){              workQueue[i] = new WorkThread(i);          }      }            public static synchronized ThreadPoolManager getInstance(){          if(instance==null)              instance = new ThreadPoolManager();          return instance;      }            public void addTask(Upload task){          //对任务队列的操作要上          synchronized (taskQueue) {              if(task!=null){                  taskQueue.add(task);                  taskQueue.notifyAll();                  System.out.println("task id "+task.getInfo() + " submit!");              }                            }      }            public void BatchAddTask(Upload[] tasks){          //对任务队列的修改操作要上锁          synchronized (taskQueue) {              for(Upload e:tasks){                  if(e!=null){                      taskQueue.add(e);                      taskQueue.notifyAll();                      System.out.println("task id "+e.getInfo() + " submit!");                  }              }                  }      }            public void destory(){          System.out.println("pool begins to destory ...");          for(int i = 0;i<worker_num;i++){              workQueue[i].stopThread();              workQueue[i] = null;          }          //对任务队列的操作要上锁          synchronized (taskQueue) {              taskQueue.clear();          }                    System.out.println("pool ends to destory ...");      }            private class WorkThread extends Thread{          private int taksId ;          private boolean isRuning = true;          private boolean isWaiting = false;                                         public WorkThread(int taskId){              this.taksId= taskId;              this.start();          }                    public boolean isWaiting(){              return isWaiting;          }          // 如果任务进行中时,不能立刻终止线程,需要等待任务完成之后检测到isRuning为false的时候,退出run()方法          public void stopThread(){              isRuning = false;          }                    @Override         public void run() {              while(isRuning){                  Upload temp = null;                  //对任务队列的操作要上锁                  synchronized (taskQueue) {                      //任务队列为空,等待新的任务加入                      while(isRuning&&taskQueue.isEmpty()){                          try {                              taskQueue.wait(20);                          } catch (InterruptedException e) {                              System.out.println("InterruptedException occre...");                              e.printStackTrace();                          }                      }                      if(isRuning)                          temp = taskQueue.remove(0);                  }                  //当等待新任务加入时候,终止线程(调用stopThread函数)造成 temp = null                  if(temp!=null){                      System.out.println("task info: "+temp.getInfo()+ " is begining");                      isWaiting = false;                      temp.uploadPic();                      isWaiting = true;                      System.out.println("task info: "+temp.getInfo()+ " is finished");                  }                  }          }      }  }

然后定义任务接口(Task):这里我定义的是上传图片的功能接口(这里用抽象类或者接口随你自己)。

public abstract class Upload {      protected String info;      abstract boolean uploadPic();      public String getInfo(){          return info;      }  }

然后定义具体任务类:我这里简单,让它睡眠2s。当然你也可以定义很多实现Upload的任务类。

public class TaskUpload extends Upload {            public TaskUpload(String info){          this.info = info;      }      public String getInfo(){          return info;      }      @Override     public boolean uploadPic()  {          // TODO Auto-generated method stub          System.out.println(info+"sleep begin ....");          try {              Thread.sleep(2000);          } catch (InterruptedException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }          System.out.println(info+"sleep end ....");          return false;      }  }

***,测试这个简单的线程池:

public class ThreadPoolManagerTest {        public static void main(String[] args) {          // TODO Auto-generated method stub          Upload[] tasks = createBatchTask(7);          ThreadPoolManager pool = ThreadPoolManager.getInstance();          pool.BatchAddTask(tasks);          pool.destory();      }      private static Upload[] createBatchTask(int n){          Upload[] tasks = new TaskUpload[n];          for(int i = 0;i<n ;i++ ){              tasks[i] = new TaskUpload("task id is "+ i);          }          return tasks;      }  }

线程池技术适用范围及应注意的问题

线程池的应用范围:

需要大量的线程来完成任务,且完成任务的时间比较短。 WEB服务器完成网页请求这样的任务,使用线程池技术是非常合适的。因为单个任务小,而任务数量巨大,你可以想象一个热门网站的点击次数。 但对于长时间的任务,比如一个Telnet连接请求,线程池的优点就不明显了。因为Telnet会话时间比线程的创建时间大多了。

对性能要求苛刻的应用,比如要求服务器迅速相应客户请求。

接受突发性的大量请求,但不至于使服务器因此产生大量线程的应用。突发性大量客户请求,在没有线程池情况下,将产生大量线程,虽然理论上大部分操作系统线程数目***值不是问题,短时间内产生大量线程可能使内存到达极限,并出现"OutOfMemory"的错误。

到此,相信大家对“Java线程池的实现方法”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Java线程池的实现方法

本文链接: https://www.lsjlt.com/news/288605.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java线程池的实现方法
    本篇内容主要讲解“Java线程池的实现方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程池的实现方法”吧!以前做的东西,实现一个简单的多线程机制,开始之前,现说说原理性的东西吧,下面...
    99+
    2023-06-17
  • java线程池实现的方法是什么
    Java中线程池的实现方法是通过使用java.util.concurrent包中的ThreadPoolExecutor类来创建和管理...
    99+
    2023-10-11
    java
  • Java线程池的构造方法怎么实现
    本篇内容主要讲解“Java线程池的构造方法怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java线程池的构造方法怎么实现”吧!一、 前言为了实现并发编程,于是就引入了进程这个概念。进程就...
    99+
    2023-06-29
  • JavaEE线程安全实现线程池方法
    前言: 线程虽然比进程更轻量,但是如果创建销毁的频率进一步增加,开销还是很大 解决方案:线程池or协程 线程池:把线程提前创建好放到池子里,后续用到线程直接从池子里取不必这边申请了。...
    99+
    2024-04-02
  • Java使用线程池实现socket编程的方法详解
    目录前言一、一个简单的C/S模型实现1.服务器:2.客户端:二、线程池使用方法1.新建一个线程池2.用Runnable接口实现线程3.创建线程对象并提交至线程池执行三、结合起来四、使...
    99+
    2024-04-02
  • 实现java简单的线程池
    目录拆分实现流程实现方式1.拒绝策略2.阻塞队列3.线程池和工作线程策略模式对比JDK的线程池线程池的状态转化总结拆分实现流程 请看下面这张图 首先我们得对线程池进行一个功能拆分 ...
    99+
    2024-04-02
  • Java简单实现线程池
    本文实例为大家分享了Java简单实现线程池的具体代码,供大家参考,具体内容如下 一、线程池 线程池是一种缓冲提高效率的技术。 相当于一个池子,里面存放大量已经创建好的线程,当有一个任...
    99+
    2024-04-02
  • c++线程池实现的方法是什么
    C++线程池的实现方法可以使用C++中的多线程库,如std::thread和std::mutex等来实现。以下是一个简单的C++线程...
    99+
    2023-10-26
    c++
  • Java线程池大小的设置方法实例
    目录Java 中线程池创建的几种方式🐱‍🏍Executors 工厂方法创建👏 new ThreadPoolExe...
    99+
    2024-04-02
  • PHP底层的线程池与协程实现方法
    PHP底层的线程池与协程实现方法在PHP编程中,线程池和协程是提高性能和并发能力的重要方法。本文将介绍PHP底层实现线程池和协程的方法,并提供具体代码示例。一、线程池的实现线程池是一种重用线程的机制,可以提高多线程应用程序的性能。在PHP中...
    99+
    2023-11-08
    线程池 PHP底层 协程实现方法
  • Java线程池的简单使用方法实例教程
    目录线程池使用场景? Java线程池使用总结线程池使用场景? java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口...
    99+
    2024-04-02
  • C/C++ 原生API实现线程池的方法
    线程池有两个核心的概念,一个是任务队列,一个是工作线程队列。任务队列负责存放主线程需要处理的任务,工作线程队列其实是一个死循环,负责从任务队列中取出和运行任务,可以看成是一个生产者和...
    99+
    2024-04-02
  • Java多线程 - 创建线程池的方法 - ThreadPoolExecutor和Executors
    文章目录 线程池(重点)线程池介绍实现线程池的方式方式一: 实现类ThreadPoolExecutorThreadPoolExecutor构造器的参数线程池处理Runnable任务线程池处理Callable任务 方式二: ...
    99+
    2023-08-30
    java jvm 开发语言
  • SpringBoot线程池和Java线程池的使用和实现原理解析
    目录SpringBoot线程池和Java线程池的用法和实现原理使用默认的线程池方式一:通过@Async注解调用方式二:直接注入 ThreadPoolTaskExecutor...
    99+
    2023-05-15
    SpringBoot线程池和Java线程池用法 SpringBoot线程池
  • Java并发包线程池ThreadPoolExecutor的实现
    线程池主要解决两个问题:一是当执行大量异步任务时线程池能够提供较好的性能。在不使用线程池时,每当需要执行异步任务时直接new一个线程来运行,而线程的创建和销毁都是需要开销的。线程池里...
    99+
    2024-04-02
  • 如何实现java简单的线程池
    这篇文章主要讲解了“如何实现java简单的线程池”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现java简单的线程池”吧!目录拆分实现流程实现方式拒绝策略阻塞队列线程池和工作线程策略模...
    99+
    2023-06-20
  • Java线程池execute()方法怎么用
    本文小编为大家详细介绍“Java线程池execute()方法怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java线程池execute()方法怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。先理解线程...
    99+
    2023-06-29
  • java线程池的实现原理、优点与风险、以及4种线程池实现
    为什么需要线程池 我们有两种常见的创建线程的方法,一种是继承Thread类,一种是实现Runnable的接口,Thread类其实也是实现了Runnable接口。但是我们创建这两种线程...
    99+
    2023-02-18
    java 线程池的实现原理 java 线程池优点与风险 java 4种线程池实现 java 配置线程池大小配置 java 线程池的实现原理
  • GOworkPool的线程池实现
    Go语言中的线程池是一种用于管理并发执行任务的设计模式。 线程池的主要目的是减少创建和销毁线程的开销,提高系统性能。 在Go语言中,线程池通常使用goroutine和channel来...
    99+
    2023-03-24
    GO workPool线程池 GO workPool
  • jdk线程池的实现
    jdk线程池ThreadPoolExecutor的7个参数 public ThreadPoolExecutor(int corePoolSize, ...
    99+
    2023-05-14
    jdk线程池
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作