package com.threadPool;
import java.util.LinkedList;
import java.util.logging.Logger;
/*start函数是任务的生产者,不断地向队列中添加任务;
* 2个工作者线程worker1和worker2,他们是工作者线程,队列中如果有任务,就领取任务执行,若无任务就休眠*/
public class TestPool {
private final static int nThreads = 100;
private final static Mythread[] threads = new Mythread[nThreads];
private final static LinkedList queue = new LinkedList();
public TestPool(int nThreads)
{
PoolWorker Worker1 = new PoolWorker();
Worker1.setName("poolwork1");
Worker1.start();
PoolWorker Worker2 = new PoolWorker();
Worker2.setName("poolwork2");
Worker2.start();
for (int i=0; i<nThreads; i++) {
threads[i] = new Mythread();
threads[i].setName("test "+i);
// execute(threads[i]);
/*try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
// threads[i].start();
}
}
private static void start(){
int i=0;
while (true) {
execute(threads[i%100]);
i = i+1;
/*try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
}
}
public static void execute(Runnable r) {
synchronized(queue) {
queue.addLast(r);
queue.notify();
}
}
private class PoolWorker extends Thread {
public void run() {
Runnable r;
while (true) {
synchronized(queue) {
while (queue.isEmpty()) {
try
{
System.out.print(getName()+" wait \n");
queue.wait();//会被queue.notify()唤醒,重新从run开始执行,而sleep不同,sleep醒之后会接着向下执行。
System.out.print(getName()+" wakeup \n");
}
catch (InterruptedException ignored)
{
}
}
r = (Runnable) queue.removeFirst();
}
// If we don't catch RuntimeException,
// the pool could leak threads
try {
System.out.print(getName()+" and task is "+r.toString()+"\n");
r.run();
}
catch (RuntimeException e) {
// You might want to log something here
}
}
}
}
private class Mythread extends Thread{
/* (non-Javadoc)
* @see java.lang.Thread#run()
*/
@Override
public void run() {
// TODO Auto-generated method stub
// super.run();
System.out.print("the"+getName()+"\n");
}
}
public static void main(String[] aString){
TestPool testPool = new TestPool(100);
start();
}
}
分享到:
相关推荐
此文档是: 基于简单线程池概念的JAVA服务器端应用 附有连接ORACLE数据库等简单操作. 操作描述: 服务器启动后,会启动10个子线程运行.(配合客户端10个请求进行模拟,控制台输出模拟过程) 服务器主程序进入一个有...
下面利用C语言来实现一个简单的线程池,为了使得这个线程池库使用起来更加方便,特在C实现中加入了一些OO的思想,与Objective-C不同,它仅仅是使用了struct来模拟了c++中的类,其实这种方式在linux内核中大量可见
}5、结论 使用SmartThreadPool可以简单就实现支持多线程的程序,由线程池来管理线程,可以减少死锁的出现。SmartThreadPool还支持简单的生产者-消费者模式,当不需要对任务进行持久化时,还是很好用的。 6、扩展阅读...
3.线程池开启循环接收客户端请求 4.当接收到客户端请求时, 产生一个新的代理socket和客户端进行通信(原来的侦听端口的socket释放,继续侦听其他客户端的请求)同时开启一个新的线程接收客户端消息 5.分析客户端的...
这只是最简单的使用,后续如果热度高的话,再录个视频教程详解吧,学到的好评给一个~ 前 言 · 之前刚接触鱼刺的时候发了个 【鱼刺线程池,自动换IP,队列重试框架...
对于我为其创建的实际问题,与标准 MEX 多线程相比,我看到了大约 60% 的加速,从而节省了几天的总模拟时间。 此外,现在向 MEX 文件添加多线程要容易得多,因为您只需要学习如何使用一个函数 AddThreadPoolJob。 ...
Scheduled-executor:一个简单的golang库,用于模拟Java中著名的调度线程池执行程序
用C++编写的线程池实现源代码,经过本人调试通过,能够模拟简单的线程池过程,代码有较详细注释,易于理解。
ThreadPool自己实现的一个简单Linux下的线程池,可以设置线程池线程个数,任务队列大小master 使用条件变量和互斥量实现同步队列,volatile变量作为线程池退出标志feature/semaphore 使用信号量维护同步队列feature/...
遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施...
3. 采用模拟 Proacto r的事件处理模式,利用线程池实现多线程机制,实现高并发通信,减少频繁创建和销毁线程带来的开销;(信号和互斥锁) 4. 主进程负责事件的读写,子线程负责业务逻辑——用有限状态机解析HTTP...
两个线程池,一个包含基于在实验期间模拟的最大客户端/用户数量的专用加载线程和一个(可能更小)用于模拟异步操作执行的共享线程池 请求生成与请求执行分离如果需要或可行,此设计选择允许 Rain 生成可由合适的第三...
一个基于android activity请求网络数据情景,做的一个java的模拟网络异步请求的简单例子,包括了线程池和软引用的简单应用
.NET 4.0引入的一个新概念---任务,作为支持并行运算的重要组成部分,同时,也作为对线程池的一个补充和完善。本资源文件中模拟一个插件的工作,在主线程中分配插件的任务,如果插件执行超时,则主线程中断任务,...
4)接口库经过高度封装,模块化强,使用简单,屏蔽了网关通信,消息收发和处理的复杂性操作,SP用户只需要关注具体的业务处理过程,大大简化了短消息开发的难度! 5)利用内建的线程池,可以大幅度提高SP短消息处理的...
介绍:基于 pthread 实现的简单线程池 源码分析: 链接: Leveldb 介绍:Jeff Dean 和 Sanjay Ghemawat 两位超级大神实现的高效 kv 数据库。 源码分析: 以上是我觉得分析得最好的两篇。不过随着 leveldb 项目的
经我自己大致测试,60个客户端以每100毫秒的频率发送消息给服务端,服务端简单处理一下后,存在服务端全局缓存中,然后服务端以每100毫秒的频率发送给所有的客户端(模拟网游同屏人数显示),60个客户端的时候,我...
发布于2013-5-13随着信息系统的结构的日益复杂和规模的...本文将介绍如何使用Java语言编写多线程的自动化测试脚本,并且使用线程池模拟一些特殊的有规律的测试场景。本文首先会简单的介绍交易中间件及Java多线程编程的
思路:利用网络客户Duan组件,与sock5服务端建立通讯并验证账户后,模拟网页访问,再取回数、据进行解析,即可获得实际IP及地区,简单粗暴有效,多线程不冲突 例子中使用的是论坛的@信易达提供的接口,可以根据例子...