java 线程池的理解_JAVA线程池原理的理解

线程池原理基础理解:

线程池初始化规定个数的线程,然后这些线程一直运行,并且监控线程队列,只要线程队列被添加进线程,那么线程池不断从队列中取出线程运行。直到队列中的线程为空。实例代码如下:

package xianchengchi;

/**

* @author 作者 刘小明

* @email ruanjianlxm@sina.com

* @version 创建时间:2014年8月16日 下午11:39:53

* 类说明

*/

//测试线程池

public class TestThreadPool {

public static void main(String[] args) {

// 创建3个线程的线程池

ThreadPool t = ThreadPool.getThreadPool(3);

t.execute(new Runnable[] { new Task(), new Task(), new Task(),new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task(), new Task() });

// t.execute(new Runnable[] { new Task(), new Task(), new Task() });

System.out.println("ttttttttttt__________-"+t);

t.destroy();// 所有线程都执行完成才destory

System.out.println(t);

}

// 任务类

static class Task implements Runnable {

private static volatile int i = 1;

@Override

public void run() {// 执行任务

System.out.println("任务 " + (i++) + " 完成");

}

}

}

package xianchengchi;

/**

* @author 作者 刘小明

* @email ruanjianlxm@sina.com

* @version 创建时间:2014年8月16日 下午11:39:28

* 类说明

*/

import java.util.LinkedList;

import java.util.List;

/**

* 线程池类,线程管理器:创建线程,执行任务,销毁线程,获取线程基本信息

*/

public final class ThreadPool {

// 线程池中默认线程的个数为5

private static int worker_num = 5;

// 工作线程

private WorkThread[] workThrads;

// 未处理的任务

private static volatile int finished_task = 0;

// 任务队列,作为一个缓冲,List线程不安全

private List taskQueue = new LinkedList();

private static ThreadPool threadPool;

// 创建具有默认线程个数的线程池

private ThreadPool() {

this(5);

}

// 创建线程池,worker_num为线程池中工作线程的个数

private ThreadPool(int worker_num) {

ThreadPool.worker_num = worker_num;

workThrads = new WorkThread[worker_num];

for (int i = 0; i 

workThrads[i] = new WorkThread();

workThrads[i].start();// 开启线程池中的线程

}

}

// 单态模式,获得一个默认线程个数的线程池

public static ThreadPool getThreadPool() {

return getThreadPool(ThreadPool.worker_num);

}

// 单态模式,获得一个指定线程个数的线程池,worker_num(>0)为线程池中工作线程的个数

// worker_num<=0创建默认的工作线程个数

public static ThreadPool getThreadPool(int worker_num1) {

if (worker_num1 <= 0)

worker_num1 = ThreadPool.worker_num;

if (threadPool == null)

threadPool = new ThreadPool(worker_num1);

return threadPool;

}

// 执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(Runnable task) {

synchronized (taskQueue) {

taskQueue.add(task);

taskQueue.notify();

}

}

// 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(Runnable[] task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

/*  // 批量执行任务,其实只是把任务加入任务队列,什么时候执行有线程池管理器觉定

public void execute(List task) {

synchronized (taskQueue) {

for (Runnable t : task)

taskQueue.add(t);

taskQueue.notify();

}

}

*/

// 销毁线程池,该方法保证在所有任务都完成的情况下才销毁所有线程,否则等待任务完成才销毁

public void destroy() {

while (!taskQueue.isEmpty()) {// 如果还有任务没执行完成,就先睡会吧

try {

Thread.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

// 工作线程停止工作,且置为null

for (int i = 0; i 

workThrads[i].stopWorker();

workThrads[i] = null;

}

threadPool=null;

taskQueue.clear();// 清空任务队列

System.out.println("销毁了线程池");

}

// 返回工作线程的个数

public int getWorkThreadNumber() {

return worker_num;

}

// 返回已完成任务的个数,这里的已完成是只出了任务队列的任务个数,可能该任务并没有实际执行完成

public int getFinishedTasknumber() {

return finished_task;

}

// 返回任务队列的长度,即还没处理的任务个数

public int getWaitTasknumber() {

return taskQueue.size();

}

// 覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数

@Override

public String toString() {

return "WorkThread number:" + worker_num + "  finished task number:"

+ finished_task + "  wait task number:" + getWaitTasknumber();

}

/**

* 内部类,工作线程

*/

private class WorkThread extends Thread {

// 该工作线程是否有效,用于结束该工作线程

private boolean isRunning = true;

/*

* 关键所在啊,如果任务队列不空,则取出任务执行,若任务队列空,则等待

*/

@Override

public void run() {

Runnable r = null;

while (isRunning) {// 注意,若线程无效则自然结束run方法,该线程就没用了

synchronized (taskQueue) {

while (isRunning && taskQueue.isEmpty()) {// 队列为空

try {

taskQueue.wait(20);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

if (!taskQueue.isEmpty())

r = taskQueue.remove(0);// 取出任务

}

if (r != null) {

r.run();// 执行任务

}

finished_task++;

r = null;

}

}

// 停止工作,让该线程自然执行完run方法,自然结束

public void stopWorker() {

isRunning = false;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/471525.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux什么时候在pc机上有一席之地

这样一个题目&#xff0c;或许会让很多linux粉丝们感到很失望&#xff0c;linux在粉丝们眼里&#xff0c;已经是开源&#xff0c;自由软件&#xff0c;反抗微软暴政的等同词。但是linux在个人电脑领域&#xff0c;确实已经面临鸡肋的局面&#xff0c;未来的发展&#xff0c;即使…

LeetCode 2068. 检查两个字符串是否几乎相等

文章目录1. 题目2. 解题1. 题目 如果两个字符串 word1 和 word2 中从 ‘a’ 到 ‘z’ 每一个字母出现频率之差都 不超过 3 &#xff0c;那么我们称这两个字符串 word1 和 word2 几乎相等 。 给你两个长度都为 n 的字符串 word1 和 word2 &#xff0c;如果 word1 和 word2 几乎…

php文本框自动补全,PHP自动补全表单的两种方法

效果图&#xff1a;第一种&#xff1a;从数据库中检索之后补全第二种&#xff1a;邮箱等纯前端的补全先说第二种&#xff0c;使用开源的插件&#xff0c;所以相对简单。github上面的项目 completer。https://github.com/fengyuanchen/completer 做法特别容易&#xff0c;github…

Spring的@Scheduled任务调度

一. 定时任务实现方式 定时任务实现方式&#xff1a; Java自带的java.util.Timer类&#xff0c;这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行&#xff0c;但不能在指定时间运行。一般用的较少&#xff0c;这篇文章将不做详细介…

LeetCode 2069. 模拟行走机器人 II(模拟)

文章目录1. 题目2. 解题1. 题目 给你一个在 XY 平面上的 width x height 的网格图&#xff0c;左下角 的格子为 (0, 0) &#xff0c;右上角 的格子为 (width - 1, height - 1) 。 网格图中相邻格子为四个基本方向之一&#xff08;"North"&#xff0c;"East&quo…

eclipse php xdebug,Eclipse for php + Xdebug搭建PHP的调试环境

Eclipse for php Xdebug搭建PHP的调试环境Eclipse for php Xdebug搭建PHP的调试环境第二步&#xff1a;下载Xdebug (下载地址位于&#xff1a; http://xdebug.org/download.php&#xff0c;我的PHP版本为 PHP 5.3.28 Thread Safety&#xff0c; Apach为2.2.25&#xff0c;使用…

ROS2.9.27架设网吧软路由实战篇之端口映射与回流

转载&#xff1a;http://blog.csdn.net/zm2714/article/details/7924280 上一篇&#xff1a;ROS2.9.27架设网吧软路由实战篇之连通网络&#xff0c;主要讲述了网吧架设软路由ROS2.9.27的基本配置&#xff0c;目的就是使网吧能顺利连接外网。没有涉及到更丰富的其它功能和网络安…

LeetCode 2070. 每一个查询的最大美丽值(离线查询+排序+优先队列)

文章目录1. 题目2. 解题1. 题目 给你一个二维整数数组 items &#xff0c;其中 items[i] [pricei, beautyi] 分别表示每一个物品的 价格 和 美丽值 。 同时给你一个下标从 0 开始的整数数组 queries 。对于每个查询 queries[j] &#xff0c;你想求出价格小于等于 queries[j]…

php接收二进制流,php接收二进制流【转】

标签&#xff1a;binary 文件 com post 进制 二进制 tip form 生成文件/** 二进制流生成文件* $_POST 无法解释二进制流&#xff0c;需要用到 $GLOBALS[‘HTTP_RAW_POST_DATA‘] 或 php://input* $GLOBALS[‘HTTP_RAW_POST_DATA‘] 和 php://input 都不能用于 …

提交app时候90475,90474

提交app是遇到如下错误&#xff1a; ERROR ITMS-90475: "Invalid Bundle. iPad Multitasking support requires launch story board in bundle xxxx." ERROR ITMS-90474: "Invalid Bundle. iPad Multitasking support requires these orientations: UIInterfac…

LeetCode 2071. 你可以安排的最多任务数目(二分查找)

文章目录1. 题目2. 解题1. 题目 给你 n 个任务和 m 个工人。每个任务需要一定的力量值才能完成&#xff0c;需要的力量值保存在下标从 0 开始的整数数组 tasks 中&#xff0c;第 i 个任务需要 tasks[i] 的力量才能完成。 每个工人的力量值保存在下标从 0 开始的整数数组 worke…

crontab 执行php脚本,为什么crontab没有执行我的PHP脚本?

我已经构建了一个php文件来检查一些结果,所以我需要设置一个cronjob.我设置一个每30分钟运行一次,以便结果发送.但是,我不知道为什么我的crontab每隔30分钟就没有运行.以下是我设置crontab的方法&#xff1a;*/30 * * * * php /var/www/html/result.php我已经确认我的文件目录是…

用JS来create结点,纯JS代码生成html页面(作业练习)

<script>window.onload function(){document.title 表单示例;var body document.body;// body append child beginvar center document.createElement(center); body.appendChild(center);var h1 document.createElement(h1);h1.innerHTML 增加用户;center.appendC…

LeetCode 2073. 买票需要的时间

文章目录1. 题目2. 解题1. 题目 有 n 个人前来排队买票&#xff0c;其中第 0 人站在队伍 最前方 &#xff0c;第 (n - 1) 人站在队伍 最后方 。 给你一个下标从 0 开始的整数数组 tickets &#xff0c;数组长度为 n &#xff0c;其中第 i 人想要购买的票数为 tickets[i] 。 …

docker php nginx,使用docker快速搭建nginx+php环境

经过了繁琐的docker环境安装&#xff0c;看了下镜像/容器的简单使用&#xff0c;开始进行nginxphp环境的搭建&#xff0c;本文记录一下在安装过程中的笔记。

使用bootstrap-table插件

1.用户提交信息过滤表格内容&#xff1a; a.设置表格查询参数&#xff0c;并在用户提交按钮时候更新表格 <form id"current_table" class"form-inline" role"form" onSubmit"return table_filter(this);">... </form> …

LeetCode 2074. 反转偶数长度组的节点(链表)

文章目录1. 题目2. 解题1. 题目 给你一个链表的头节点 head 。 链表中的节点 按顺序 划分成若干 非空 组&#xff0c;这些非空组的长度构成一个自然数序列&#xff08;1, 2, 3, 4, …&#xff09;。一个组的 长度 就是组中分配到的节点数目。换句话说&#xff1a; 节点 1 分…

php判断全是中文正则,php判断是否为中文正则表达式大全

php判断是否为中文正则表达式大全$str"aaa";if(!eregi("[^\x80-\xff]","$str")){echo "是";}else{echo "不是";}?>$str "中国";echo $str;echo "";//if (preg_match("/^[".chr(0xa1).&q…

[转]Hadoop集群_WordCount运行详解--MapReduce编程模型

Hadoop集群_WordCount运行详解--MapReduce编程模型 下面这篇文章写得非常好&#xff0c;有利于初学mapreduce的入门 http://www.nosqldb.cn/1369099810935.html 转载于:https://www.cnblogs.com/wxquare/p/4889613.html

LeetCode 2075. 解码斜向换位密码(模拟)

文章目录1. 题目2. 解题1. 题目 字符串 originalText 使用 斜向换位密码 &#xff0c;经由 行数固定 为 rows 的矩阵辅助&#xff0c;加密得到一个字符串 encodedText 。 originalText 先按从左上到右下的方式放置到矩阵中。 先填充蓝色单元格&#xff0c;接着是红色单元格…