zoukankan
html css js c++ java
java写的简单线程池
import java.util.
*
;
import java.io.
*
;
import java.net.
*
;
//
线程池类,创建处于使用中和空闲中的进程队列
class
ThreadPool
{
private
Vector freeThreads
=
new
Vector();
private
Vector inUseThreads
=
new
Vector();
//
Vetcor对象
private
static
int
value
=
100
;
//
线程池的最大并发线程数
public
ThreadPool()
{
fillpool(value);
}
private
void
fillpool(
int
poolsize)
{
for
(
int
i
=
0
;i
<
poolsize;i
++
)
{
//
this为所处的类内的当前该类对象,当前为ThreadPool类对象
PoolableThread pt
=
new
PoolableThread(
this
);
//
传入线程池对象
pt.start();
//
启动线程
freeThreads.add(pt);
//
加入空闲线程队列
}
try
{
Thread.sleep(
100
);
//
线程休眠
}
catch
(InterruptedException ie)
{}
}
public
synchronized
void
runTask(Runnable task)
{
//
运行Runnable接口
if
(freeThreads.isEmpty())
{
throw
new
RuntimeException(
"
All threads are in use
"
);
//
空闲线程为空,抛出异常
}
PoolableThread t
=
(PoolableThread)freeThreads.remove(
0
);
//
提取空闲线程
inUseThreads.add(t);
//
加入到使用状态队列当中
t.setTask(task);
//
传入Runnable接口类型对象
}
synchronized
void
free(PoolableThread t)
{
inUseThreads.remove(t);
//
释放使用状态队列
freeThreads.add(t);
//
加入到空闲队列中
}
}
//
PoolableThread进程类
class
PoolableThread extends Thread
{
Runnable task
=
null
;
ThreadPool pool;
PoolableThread(ThreadPool pool)
{
this
.pool
=
pool;
//
PoolableThread类当前对象(this)的pool变量初始化
}
synchronized
void
setTask(Runnable task)
{
this
.task
=
task;
//
PoolableThread类当前对象(this)的task变量初始化
notify();
//
唤醒等待进程
}
synchronized
void
executeTasks()
{
//
等待进程被唤醒后执行Runnable接口
for
(; ; )
{
try
{
if
(task
==
null
)
{
wait();
//
如果Runnable对象实例task为空,进入等待状态
}
}
catch
(InterruptedException ex)
{}
task.run();
//
执行Runnable接口run方法
task
=
null
;
//
执行完后释放Runnable对象task
pool.free(
this
);
//
释放
}
}
public
void
run()
{
//
PoolableThread进程类run()方法
executeTasks();
}
}
//
Runnable接口类
public
class
PoolTest implements Runnable
{
public
static
ThreadPool tp
=
new
ThreadPool();
//
线程池类对象
Socket socket;
BufferedReader
in
;
PrintWriter
out
;
public
PoolTest(Socket socket)throws IOException
{
this
.socket
=
socket;
//
初始化socket
this
.
in
=
new
BufferedReader(
new
InputStreamReader(socket.getInputStream()));
//
建立输入流管道
this
.
out
=
out
=
new
PrintWriter(
new
BufferedWriter(
new
OutputStreamWriter(socket.getOutputStream())),
true
);
//
建立输出流管道
tp.runTask(
this
);
//
运行Runnable类接口
try
{Thread.sleep(
100
);}
catch
(Exception e)
{}
}
public
static
void
main(String[] args)throws IOException
{
ServerSocket s
=
new
ServerSocket(
8080
);
//
初始化服务器端口
int
i
=
0
;
System.
out
.println(
"
Server start..
"
+
s);
try
{
while
(
true
)
{Socket socket
=
s.accept();
//
无限监听客户请求
System.
out
.println(
"
Connectino accept:
"
+
socket
+
"
"
+
i);
i
++
;
try
{
new
PoolTest(socket);
//
调用Runnable接口进程
}
catch
(IOException e)
{socket.close();}
}
}
finally
{s.close();}
}
public
void
run()
{
try
{
while
(
true
)
{
String str
=
in
.readLine();
//
读取输入流
if
(str.equals(
"
end
"
))
break
;
System.
out
.println(
"
Echo ing :
"
+
str);
}
System.
out
.println(
"
Close
"
);
}
catch
(IOException e)
{}
finally
{
try
{socket.close();}
catch
(IOException e)
{}
}
}
}
//
服务器程序结束
请各位朋友指正
查看全文
相关阅读:
ModuleNotFoundError: No module named 'babel' 解决办法
linux修改时间
Ubuntu 18.04 安装 odoo12 源码版
开源ERP框架Odoo学习
浅谈我对DDD领域驱动设计的理解(转)
一步步带你做vue后台管理框架
一步一步使用ABP框架搭建正式项目系列教程
C#编写好的windows服务,在本机上运行很好,考到其他电脑运行出现“错误1053: 服务没有及时响应启动或控制请求”的解决办法
公用表表达示展BOM示例
sqlserver 2005新功能
原文地址:https://www.cnblogs.com/oisiv/p/217513.html
最新文章
网络协议基础
日志的简单处理
约束和自定义异常
类的相关内置函数及反射
类的组合和其他特殊成员
面向对象(进阶)
初识面向对象
模块和包
异常处理
MVC RPC SOA 和微服务架构的区别
热门文章
@responsebody
eclipse如何将上一个项目的工作空间配置应用到新项目,避免重新设置
遇见的oracle数据库和mysql数据库对于一个sql语句的不同支持情况
关于在博客园慢慢更新面试题的想法
ThreadLocal的功能测试的代码,以及对照组的测试的代码
如何快速复制浏览器正在打开的所有网页的网址,而不需要一个个手动复制网址或者点收藏网页
写一个DCL懒汉单例式
hashmap在resize扩容的时候,将旧哈希表中的元素映射到新哈希表中元素key值是否有经过hash扰动
hashmap的hash方法为什么需要让高16位参与异或运算的原因
关于linux的more命令不能向前翻页
Copyright © 2011-2022 走看看