当前位置: 首页 > news >正文

建设网站上传代码外网网站建设

建设网站上传代码,外网网站建设,安装钢结构网架公司,物流查询网站开发文章目录 1. 什么是线程池2. 为什么要使用线程池#xff08;线程池有什么优点#xff09;3. 如何使用Java标准库提供的线程池3.1 创建一个线程池对象3.2 什么是工厂模式3.3 为什么要使用工厂模式3.4 Executors 创建不同具有不同特性的线程池3.5 ThreadPool 类的构造方法3.6 线… 文章目录 1. 什么是线程池2. 为什么要使用线程池线程池有什么优点3. 如何使用Java标准库提供的线程池3.1 创建一个线程池对象3.2 什么是工厂模式3.3 为什么要使用工厂模式3.4 Executors 创建不同具有不同特性的线程池3.5 ThreadPool 类的构造方法3.6 线程池的拒绝策略3.7 调用 submit 方法添加任务 4. 自己实现一个线程池 1. 什么是线程池 线程池是一种多线程处理形式它处理过程中将任务添加到队列然后在创建线程后自动启动这些任务。线程池中的线程都是后台线程。每个线程都使用默认的堆栈大小以默认的优先级运行并处于多线程单元中。如果某个线程在托管代码中空闲如正在等待某个事件,则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙但队列中包含挂起的工作则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队但他们要等到其他线程完成后才启动。线程池避免了在处理短时间任务时创建与销毁线程的代价从而提高了程序的效率和性能。 2. 为什么要使用线程池线程池有什么优点 我们都知道在 Java 中使用多进程效率是比较低的因为进程的创建和销毁的开销是比较大的这样就会导致进程的创建和销毁的速度比较慢。所以在多进程的基础上就出现了线程。线程的创建和销毁都比较轻量多个线程共用一套资源这就避免了多次向计算机申请资源极大提高了代码的执行速度。但是如果一个线程多次创建和销毁的话也会导致系统资源的频繁调用并且创建和销毁线程的而操作是内核态的计算机通过调用相关的 API然后进行线程的创建和销毁但是既然是内核态操作那么在计算机创建和销毁线程的过程中可能不是只干了这一件事可能还会顺便帮其他线程提供资源等这样就降低了代码的执行速度所以为了解决线程多次创建和销毁并且保证线程的创建和销毁属于用户态的操作的问题就出现了线程池这一概念。在线程池中会提前创建 n 个线程这些线程在执行完后不会销毁而是继续存储在线程池当中等待下一次调用正是因为线程池的这一概念就使得线程创建和销毁的频率降低了。 总结来说线程池的优点有以下这些 降低资源消耗通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度当任务到达时任务无需等待线程创建可以立即执行。提高线程的可管理性线程是稀缺资源如果无限制的创建不仅会消耗系统资源还会降低系统的稳定性。使用线程池可以进行统一的分配调优和监控。避免系统过度切换如果不使用线程池有可能会造成系统创建大量同类线程而导致消耗完内存或者产生“过度切换”的问题。 3. 如何使用Java标准库提供的线程池 3.1 创建一个线程池对象 在Java的 java.util.concurrent 包中提供了线程池相关的方法。那么如何创建出能执行线程池相关操作的对象呢 ExecutorService service Executors.newScheduledThreadPool(3);ExecutorService 是Java中的一个接口它继承了Executor接口。 ExecutorService 接口在 java.util.concurrent 包中它用于管理线程池。它提供了一种方式来管理和控制线程的生命周期。具体来说它用于创建和管理线程池可以执行线程也可以关闭线程池。 而 Executors 则是一个工厂类用来创建不同类型的 ThreadPoolExecutor 实例。 看到工厂类就需要提到一个常用的模式——工厂模式了那么什么又是工厂模式呢 3.2 什么是工厂模式 工厂模式是一种创建型设计模式它提供了一种创建对象的最佳方式通过将对象的实例化过程封装在工厂类中使得创建对象的方式更加灵活和可扩展。 在工厂模式中客户端代码只需关注接口而无需关注对象的具体创建过程。工厂模式通过提供一个统一的接口来创建不同类型的对象这个接口定义了创建对象的标准方式。 3.3 为什么要使用工厂模式 工厂模式的作用是用来创建一个类的不同类型对象既然这样的话我们在一个类中使用多种重载的构造方法不就好了吗为什么要多此一举再创建一个工厂类来创建一个类的不同类型的对象呢 如果我们不使用工厂类来创建不同类型的对象那么在创建对象的时候就需要在客户端中显式地选择合适的构造方法并提供对应的参数这样的话类的具体创建逻辑就暴露了。而使用工厂模式的话客户端代码只需调用工厂类的接口即可而无需了解具体的创建逻辑。这样可以将对象的创建与使用代码分离使得系统更加灵活可扩展性更强。同时使用工厂模式还可以避免在客户端代码中暴露对象的创建逻辑提高了系统的安全性。 当创建线程池对象的时候我们只需要调用 Executors 工厂类的对应静态方法并且传递对应的参数就可以得到不同类型的 ThreadPoolExexutor 实例了通过这个工厂模式既实现了创建一个类的不同实例的功能又保证了系统的安全性。 3.4 Executors 创建不同具有不同特性的线程池 在知道什么是工厂模式之后我们就利用这个工厂类来创建出需要的线程池实例那么 Executors 工厂类又提供了哪些创建线程池对象的方法呢它们又分别具有什么特性呢 newFixedThreadPool() 方法 newCachedThreadPool() 方法 newScheduledThreadPool() 方法 Executors 工厂类还有很多不同的创建线程池对象的方法这里我就不给大家一一展示出来了大家如果感兴趣的话可以去Java帮助文章上去查看。 3.5 ThreadPool 类的构造方法 通过查看源码我们可以知道Executors 工厂类创建的线程池对象都是通过传递不同的参数来实例化 ThreadPool 类的也就是说 ThreadPool 类具有多种构成重载的构造方法那么来看看这些不同的构造函数的参数分别代表什么吧。 corePoolSize 表示线程池中的核心线程数maximumPoolSize 表示线程池中可含有的最大线程数keepAliveTime 表示当线程池中的线程数量超过核心线程数corePoolSize时多余的空闲线程在终止之前等待新任务的最长时间。TimeUnit unit 用于指定keepAliveTime参数的时间单位。workQueue 表示阻塞队列可以根据需要设置阻塞队列的类型如果需要优先级则可以使用PriorityBlockingQueue如果不需要优先级且任务的数目是恒定的则可以使用ArrayBlockingQueue如果任务的数目不是恒定的则可以使用LinkedBlockingQueueThreadFactory 表示工厂类RejectedExecutionHandle handle 表示拒绝策略 这里解决策略是面试中容易考的高频考点那么这里我们就来详细的说说关于线程池的拒绝策略。 3.6 线程池的拒绝策略 当线程池中容纳的任务数量到达了最大限制之后如果继续往里面添加任务的话会出现什么情况呢Java 中提供了4种拒绝策略。 ThreadPoolExecutor.AbortPolicy 抛出异常ThreadPoolExecutor.CallerRunsPolicy 新添加的任务由添加任务的线程执行该任务ThreadPoolExecutor.DiscardOldestPolicy 丢弃掉最旧的未被处理的请求ThreadPoolExecutor.DiscardPolicy 丢弃掉当前新加的任务 3.7 调用 submit 方法添加任务 当创建了适当的线程池对象并且了解了其中创建的细节了之后我们就需要调用该线程对象的相关方法来执行代码。 使用 submit 方法来添任务。 public class Demo1 {public static void main(String[] args) {ExecutorService service Executors.newFixedThreadPool(4);service.submit(new Runnable() {Overridepublic void run() {System.out.println(线程1);}});service.submit(new Runnable() {Overridepublic void run() {System.out.println(线程2);}});service.submit(new Runnable() {Overridepublic void run() {System.out.println(线程3);}});service.submit(new Runnable() {Overridepublic void run() {System.out.println(线程3);}});} }4. 自己实现一个线程池 同样的虽然 Java 标准库提供了线程池但是我们作为初学者如果能够自己实现一个线程池那么对于我们理解其中的逻辑和细节很有帮助。 class MyThreadPool {//创建一个阻塞队列BlockingDequeRunnable queue new LinkedBlockingDeque();//实现submit方法public void submit(Runnable runnable) throws InterruptedException {queue.put(runnable);}//实现构造方法类创建的时候就会执行任务public MyThreadPool(int n) {for(int i 0; i n; i) {Thread t new Thread(() - {Runnable runnable null;try {runnable queue.take();} catch (InterruptedException e) {throw new RuntimeException(e);}runnable.run();});t.start();}} }测试 public class Demo2 {public static void main(String[] args) throws InterruptedException {MyThreadPool myThreadPool new MyThreadPool(4);for(int i 0; i 4; i) {int id i;myThreadPool.submit(new Runnable() {Overridepublic void run() {System.out.println(执行线程 id);}});}} }由于使用的是阻塞队列所以当线程池中的任务达到数量限制的时候如果再添加任务会进入阻塞等待状态这是不同于Java标准库提供的四种拒绝策略。
http://www.w-s-a.com/news/945783/

相关文章:

  • 网站建设任务执行书重庆今天新闻事件
  • 怎样发布自己的网站南宁制作网站公司
  • wordpress装多站点百度查一下
  • 怎么优化一个网站搭建网站免费空间
  • 山东建设和城乡建设厅注册中心网站首页wordpress安装教材
  • 个人风采网站制作毕节网站开发公司电话
  • 网络网站销售设计主题和设计理念
  • 做网站一般用什么服务器承德专业做网站
  • 松北区建设局网站网站建设分为几种
  • 网站建设的合同 体会智联招聘网站建设情况
  • 记的网站域名wordpress地方信息主题
  • 淄博好的建网站公司网站建设 海口
  • 有人做网站花了10几万2017做啥网站能致富
  • 做网站有什么软件cod建站平台
  • 合肥学校网站建设怎么做免费的产品图片网站
  • 营养早餐网站的设计与制作建设通网站怎么查项目经理在建
  • 浑南区建设局网站永州网站建设公司推荐
  • 做外贸都得有网站吗绵阳网站建设制作
  • 功能性的网站建设北京餐饮品牌设计公司
  • php做网站优势视频直播软件
  • 怎么安装php网站哪个网站是专门为建设方服务的
  • 重慶网站开发sina app engine wordpress
  • wampserver网站开发步骤中冠工程管理咨询有限公司
  • 自己做网站商城需要营业执照吗老外做牛排的视频网站
  • 网站推广效果的评估指标主要包括公司广告推广
  • 昆明网站建设那家好哪个网站学做凉皮
  • hype做网站动效哪里有给网站做
  • 打扑克网站推广软件设计类专业哪个最好
  • 网站设计首页网站建设意向书
  • 做网站要学那些angularjs后台管理系统网站