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)
{}
}
}
}
//
服务器程序结束
请各位朋友指正
查看全文
相关阅读:
Oracle-增加字段
Oracle数据库将varchar类型的字段改为Clob类型
将Oracle数据库字段长度进行修改
http请求util
读取excel文件后,将一行数据封装成一个对象,多行返回一个map对象即可
使用tushare 库查阅交易日历
python winsound模块
python可视化:matplotlib系列
期货、股指期权、ETF期权
股指期货
原文地址:https://www.cnblogs.com/oisiv/p/217513.html
最新文章
Go组件:go中grom学习
Vscode写go代码报错红色波浪线
vue+go环境快速搭建(使用vscode)
centos7安装mysql5.7.24,并使用system管理mysql
centos7安装redis5.0.3,并使用system管理redis
Jumpserver堡垒机安装配置全过程
防抖函数
物理像素自适应布局
Aioxs拦截器配置
访问者模式
热门文章
观察者模式&&发布者/订阅者模式
vue day01 基本指令实战
你好javascript day20
原生js实现Ajax方法
JSON字符串和JSON对象
你好javascript day19
MySql数据库中,字段类型为datetime,转换年月日的方法
Oracle数据库时间戳转换为年月日等时间格式
Oracle删除/创建/修改序列
Oracle数据库字段内容前添加字符串
Copyright © 2011-2022 走看看