jake1036
导航
BlogJava
首页
新随笔
联系
聚合
管理
<
2010年7月
>
日
一
二
三
四
五
六
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
统计
随笔 - 19
文章 - 0
评论 - 10
引用 - 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
给我留言
查看公开留言
查看私人留言
随笔档案
2010年11月 (1)
2010年9月 (1)
2010年8月 (1)
2010年7月 (9)
搜索
最新评论
1. re: java UDP 操作
<font size=4>写的不错!</font>
--o
2. re: java socket连接池
是不是可以在建立一个连接池,比如5个连接到服务器的连接,客户端在需要连接的时候,由服务器发给它一个可用的连接
--songxin
3. re: java socket连接池
@yackl
请问下,有没大概或者简单点的解决办法了?
--songxin
4. re: java socket连接池
这个连接池没什么大的作用啊。
服务器端是在接收到客户端的请求之后起一个线程处理的,
你只能说你有5个线程等待处理socket请求。
--songxin
5. re: java socket连接池[未登录]
垃圾
--aaa
阅读排行榜
1. java socket连接池(5303)
2. java socket非阻塞I/O(4487)
3. java日期控件(2423)
4. java UDP 操作(2371)
5. 利用回调函数在线程和主类中传递信息(782)
评论排行榜
1. java socket连接池(9)
2. java UDP 操作(1)
3. java日期控件(0)
4. java被隐藏的指针(0)
5. java socket非阻塞I/O(0)
java线程池的概念
一 线程池
向I/0受限的程序,使用多线程会极大地提高性能。 但是线程有着自己的开销,启动一个线程和
结束一个线程会耗费虚拟机大量的工作。
二 解决方法
通过使用重用线程的方法,来达到两全其美的效果。把所有需要完成的任务放在队列或者其他的数据结构中,让每个线程完成前面的任务之后,
再从队列中获取新的任务,这就称为
线程池
,保存任务的数据结构叫做池 (pool) 。
三 实现方法 :
1 第一次分配固定数量的线程,当池空时,每个线程都在池中等待。 当向池添加一个任务的时候,所有等待的进程
得到通知,当一个线程结束其分配的任务时,它再回到池中取新的任务,如果没有得到他就等待,直到新的任务
添加到池中。
2 将线程本身放在池中,让主线程从池中取出线程,为其分配任务。如果必须要完成某项任务,而池中没有线程的时候,
主程序就会成为一个新的线程。每个线程结束之后,都会返回到池中。
四 实例 : 压缩指定文件夹内的所有文件
1 首先读取文件夹中的文件,这是一个I/O密集型的操作。
2 而数据压缩则是一个CPU密集型操作 。
所以这时候 就需要线程池。 主程序负责确定压缩哪个文件,而客户端程序进行具体的压缩的工作。
五 步骤
首先填充池,然后启动池中的压缩文件的线程,
六 代码
采用的方法是 四 的第一种方法,即首先出示化一个线程组,然后创建一个任务池,池中存储的是所要读取的
文件 , 每当池空的时候,判断时候结束,没有结束的话,就等待在pool。
池不空的情况下就从池中弹出一个任务,处理。
值得注意的是 , 如何判断文件压缩是否完成
package
cn.bupt.pool;
import
java.io.BufferedInputStream;
import
java.io.BufferedOutputStream;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.OutputStream;
import
java.util.List;
import
java.util.zip.GZIPOutputStream;
public
class
GZipThread
extends
Thread
{
private
List pool ;
private
static
int
filesCompressed
=
0
;
public
GZipThread(List pool)
{
this
.pool
=
pool;
}
private
static
synchronized
void
incrementFilesCompressed()
{
filesCompressed
++
;
}
public
void
run()
{
while
(filesCompressed
!=
GZipAllFiles.getNumberOfFilesToBeCompressed())
{
File input
=
null
;
synchronized
(pool)
{
while
(pool.isEmpty())
{
if
(filesCompressed
==
GZipAllFiles.getNumberOfFilesToBeCompressed())
{
System.out.println(
"
Thread ending
"
);
return
;
}
try
{
pool.wait() ;
}
catch
(InterruptedException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
input
=
(File) pool.remove(pool.size()
-
1
) ;
incrementFilesCompressed();
}
/**/
/*
不压缩已经压缩过的文件
*/
if
(
!
input.getName().endsWith(
"
.gz
"
))
{
InputStream in
=
null
;
try
{
in
=
new
FileInputStream(input);
}
catch
(FileNotFoundException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
in
=
new
BufferedInputStream(in) ;
/**/
/*
设置压缩后保存的文件
*/
File output
=
new
File(input.getParent() , input.getName()
+
"
.gz
"
) ;
if
(
!
output.exists())
{
OutputStream out
=
null
;
try
{
out
=
new
FileOutputStream(output);
}
catch
(FileNotFoundException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
try
{
out
=
new
GZIPOutputStream(out) ;
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
out
=
new
BufferedOutputStream(out) ;
int
b ;
try
{
while
((b
=
in.read())
!=
-
1
)
try
{
out.write(b) ;
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
catch
(IOException e1)
{
//
TODO Auto-generated catch block
e1.printStackTrace();
}
try
{
out.flush() ;
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
try
{
out.close() ;
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
try
{
in.close() ;
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
}
九 主类代码
package
cn.bupt.pool;
import
java.io.File;
import
java.util.Vector;
public
class
GZipAllFiles
{
/**/
/*
连接的线程数目
*/
public
final
static
int
THREAD_COUNT
=
4
;
private
static
int
filesToBeCompressed
=
-
1
;
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
//
TODO Auto-generated method stub
Vector pool
=
new
Vector();
/**/
/*
* 初始化线程数组
*/
GZipThread[] threads
=
new
GZipThread[THREAD_COUNT];
for
(
int
i
=
0
; i
<
threads.length; i
++
)
{
threads[i]
=
new
GZipThread(pool);
threads[i].start();
}
int
totalFiles
=
0
;
for
(
int
i
=
0
; i
<
args.length; i
++
)
{
File f
=
new
File(args[i]);
if
(f.exists())
{
if
(f.isDirectory())
{
File[] files
=
f.listFiles();
for
(
int
j
=
0
; j
<
files.length; j
++
)
{
/**/
/*
不递归处理目录
*/
if
(
!
files[j].isDirectory())
{
totalFiles
++
;
synchronized
(pool)
{
pool.add(files[j]);
pool.notifyAll();
}
}
}
}
/**/
/*
如果是一个单独的文件
*/
else
{
totalFiles
++
;
synchronized
(pool)
{
pool.add(
0
, f);
pool.notifyAll();
}
}
}
}
filesToBeCompressed
=
totalFiles;
/**/
/*
* 确保让所有的线程知道没有更多的文件会添加到池中
*/
for
(
int
i
=
0
; i
<
threads.length; i
++
)
{
threads[i].interrupt();
}
}
public
static
int
getNumberOfFilesToBeCompressed()
{
return
filesToBeCompressed;
}
}
posted on 2010-07-14 21:08
buptduming
阅读(506)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理