多线程线程池的实现java

线程是独立程序的执行路径。 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable。

多线程是指在一个任务中同时执行两个或多个线程。在多线程中,每个任务可以有多个线程,并且这些线程可以异步或同步地并行运行。 您可以在我在此处撰写的另一篇有关多线程的教程中找到有关线程和多线程的更多信息。

1.什么是线程池

线程池代表一组执行任务的工作线程,每个线程可以多次重用。 如果在所有线程都处于活动状态时提交了新任务,则它们将在队列中等待,直到某个线程可用为止。 线程池实现在内部使用LinkedBlockingQueue在队列中添加和删除任务。
我们通常想要的是一个工作队列,该队列与一组固定的工作线程组合在一起,该工作线程使用wait()notify()来向等待线程发出新工作到达的信号。 以下示例显示了一个简单的工作队列,该队列是Runnable对象的队列。 尽管没有特别要求Thread API使用Runnable接口,但这是调度程序和工作队列的通用约定。
package tutorials;import java.util.concurrent.LinkedBlockingQueue;public class ThreadPool {private final int nThreads;private final PoolWorker[] threads;private final LinkedBlockingQueue queue;public ThreadPool(int nThreads) {this.nThreads = nThreads;queue = new LinkedBlockingQueue();threads = new PoolWorker[nThreads];for (int i = 0; i < nThreads; i++) {threads[i] = new PoolWorker();threads[i].start();}}public void execute(Runnable task) {synchronized (queue) {queue.add(task);queue.notify();}}private class PoolWorker extends Thread {public void run() {Runnable task;while (true) {synchronized (queue) {while (queue.isEmpty()) {try {queue.wait();} catch (InterruptedException e) {System.out.println("An error occurred while queue is waiting: " + e.getMessage());}}task = queue.poll();}// If we don't catch RuntimeException,// the pool could leak threadstry {task.run();} catch (RuntimeException e) {System.out.println("Thread pool is interrupted due to an issue: " + e.getMessage());}}}}
}

在处理队列时使用同步块很重要,以控制线程对队列的访问。

package tutorials;public class Task implements Runnable {private int num;public Task(int n) {num = n;}public void run() {System.out.println("Task " + num + " is running.");}
}
import tutorials.Task;
import tutorials.ThreadPool;public class Main {public static void main(String[] args) {ThreadPool pool = new ThreadPool(7);for (int i = 0; i < 5; i++) {Task task = new Task(i);pool.execute(task);}
}

在上面的示例中,我们使用notify()而不是notifyAll() 。 因为notify()具有比notifyAll()更理想的性能特征; 特别是, notify()导致更少的上下文切换,这在服务器应用程序中很重要。 但是,使用时要确保重要notify()在其他情况下,因为与使用有关的微妙风险notify()它是唯一适当使用它在特定条件下。

下图演示了以上示例中的线程池设计。

图1。 线程池设计

2.有效使用线程池

线程池是一种用于构造多线程应用程序的强大机制,但并非没有风险。 使用线程池构建的应用程序可能具有与任何其他多线程应用程序相同的并发风险,例如死锁资源崩溃,同步或并发错误,线程泄漏和请求重载

这里有几点:

  • 不要将同步等待其他任务的任务排入队列,因为这会导致死锁。
  • 如果任务需要等待诸如I / O之类的资源,请指定最大等待时间,然后使任务执行失败或重新排队。 这保证了通过释放线程执行可能成功完成的另一任务将取得一些进展。
  • 有效地调整线程池的大小,并了解线程太少或线程太多都会导致问题。 线程池的最佳大小取决于可用处理器的数量以及工作队列上任务的性质。

3.结论

线程池对于组织服务器应用程序很有用,并且正确地实现它以防止任何问题(例如死锁和wait()notify()使用的复杂性)非常重要。 因此,建议考虑使用util.concurrent中的Executor类之一,例如ThreadPoolExecutor ,而不是从头开始编写线程池。 如果要求创建线程来处理短期任务,则可以考虑使用线程池。

4.下载源代码

这是线程池的教程,要下载源代码,请单击此处 。

翻译自: https://www.javacodegeeks.com/2016/12/implement-thread-pool-java.html

多线程线程池的实现java

多线程线程池的实现java_如何在Java中实现线程池相关推荐

  1. 如何在java中实现线程_用代码说话:如何在Java中实现线程

    并发编程是Java语言的重要特性之一,"如何在Java中实现线程"是学习并发编程的入门知识,也是Java工程师面试必备的基础知识.本文从线程说起,然后用代码说明如何在Java中实现 ...

  2. 字符串压缩 java_如何在Java中压缩字符串?

    如何在Java中压缩字符串? 我使用GZIPOutputStream或ZIPOutputStream压缩字符串(我的2222235278130938882小于20),但压缩结果比原始字符串长. 在某个 ...

  3. 如何在Java中实现线程池

    线程是独立程序的执行路径. 在java中,每个线程都扩展java.lang.Thread类或实现java.lang.Runnable. 多线程是指在一个任务中同时执行两个或多个线程.在多线程中,每个任 ...

  4. 如何在JAVA中创建线程池

    ExecutorService 今天小编要分享的是关于线程池, 想必接触到并发处理的朋友都有用到线程池, 当我们访问服务器的量达到服务器一定量的时候, 比如几百万几千万,很容易造成服务器崩掉, 如果使 ...

  5. setyear java_如何在Java中创建不可变类

    如果对象在构造后无法更改,则该对象是不可变的.不可变对象不会以任何方式暴露其他对象来修改其状态; 对象的字段仅在构造函数内初始化一次,并且永远不会再次更改. 在本文中,我们将定义在Java中创建不可变 ...

  6. c#枚举类似于java_如何在Java中获得类似于C的性能

    c#枚举类似于java 总览 Java有许多可能很慢的领域. 但是,对于每个问题都有解决方案. 许多解决方案/黑客都需要解决Java的保护问题,但是如果您需要低水平的性能,还是可以的. Java使高级 ...

  7. 你如何在java中获取线程堆_如何在Windows上获取未在控制台中运行的Java进程的线程和堆转储...

    问题 我有一个Java应用程序,我从控制台运行,然后控制台执行另一个Java进程.我想获得该子进程的线程/堆转储. 在Unix上,我可以做akill -3 但是在Windows AFAIK上获取线程转 ...

  8. 怎么比较字符串java_如何在Java中比较字符串?

    在本文中,优锐课将带你学习如何比较字符串以及使用等于(=)运算符比较字符串时发生的问题. 介绍 字符串是Java中的特殊类.我们在Java程序中定期使用String,因此比较两个字符串是Java中的一 ...

  9. java线程提高速度_如何在JAVA中减慢线程速度

    我有这个类,我在其中运行10次for循环.该类实现了Runnable接口.现在在main()中我创建了2个线程.现在两个都将循环运行到10.但我想检查每个线程的循环计数.如果t1超过7,则让它休眠1秒 ...

最新文章

  1. SQL SERVER 函数ROW_NUMBER() 应用
  2. mysql 脑裂的问题,DRBD脑裂问题故障处理
  3. keras 的 example 文件 babi_memnn.py 解析
  4. 经济民族主义的前夜?普华永道思略特全球创新1000强解读
  5. Qt修炼手册11_多线程编程和QThread类
  6. inteliji 优化
  7. android4 设置栈大小,【技术分享】Android内核漏洞利用技术实战:环境搭建栈溢出实战...
  8. 深度学习(7)TensorFlow基础操作三: 索引与切片
  9. JS逻辑运算符——短路逻辑
  10. 基本Linux命令的用法
  11. 打不过 Chrome 的 Firefox,我为什么要选择?
  12. 软考高级 真题 2014年下半年 信息系统项目管理师 论文
  13. 苹果开发者中心添加UDID设备教程(及获取苹果手机的UDUD)
  14. 如何修改Windows(可移植)桌面文件夹图标
  15. 用rand(7)构造rand(10)
  16. 践行社会责任的路上,中概股们看到了怎样的风景?
  17. echarts pie饼图既显示内部又显示外部指示线
  18. 护理管理学选择题汇总(人卫第三版)
  19. 学钢琴看简谱 你看这张图就够了
  20. 如何使用 Django 进行分页

热门文章

  1. YBTOJ洛谷P4331:数字序列(左偏树)
  2. jzoj5097-[GDOI2017day1]取石子游戏【并查集,LCA】
  3. POJ3348-Cows【凸包,计算几何】
  4. Codeforces1045I
  5. Codeforces Round #491 (Div. 2)
  6. 动态规划训练18 [免费馅饼 HDU - 1176 ]
  7. 5、java中的数组
  8. 揭秘阿里秒级百万TPS平台架构实现
  9. JVM-对象的存活与死亡
  10. 并发编程 – Concurrent 用户指南