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 操作(2370)
5. 利用回调函数在线程和主类中传递信息(782)
评论排行榜
1. java socket连接池(9)
2. java UDP 操作(1)
3. java日期控件(0)
4. java被隐藏的指针(0)
5. java socket非阻塞I/O(0)
回调对象列表方式来实现线程和主类之间的交互
一 概述
前面已经实现了 采用静态函数 , 实例函数 ,下面主要讲使用回调对象列表的方式。
1 首先是一个接口类
任何想获得线程结果的函数,都需要实现这个接口
package
cn.bupt.thread;
public
interface
DigestListener
{
public
void
digestCalculated(
byte
[] digest) ;
}
2 下面是一个线程类
该类的成员变量有维护一个vector , 里面存储的是想与该线程交互的对象 , 这些对象都实现了 上面的特定接口。
package
cn.bupt.thread;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.security.DigestInputStream;
import
java.security.MessageDigest;
import
java.security.NoSuchAlgorithmException;
import
java.util.
*
;
public
class
ListCallbackDigest
implements
Runnable
{
private
File input ;
List listener
=
new
Vector() ;
public
ListCallbackDigest(File input)
{
this
.input
=
input ;
}
public
synchronized
void
addDigestListener(DigestListener l)
{
listener.add(l) ;
}
public
synchronized
void
removeDigestListener(DigestListener l)
{
listener.remove(l) ;
}
public
synchronized
void
sendDigest(
byte
[] digest)
{
ListIterator iterator
=
listener.listIterator() ;
while
(iterator.hasNext())
{
/**/
/*
* 调用容器中的方法
*/
DigestListener dl
=
(DigestListener) iterator.next() ;
/**/
/*
调用主类中的
*/
dl.digestCalculated(digest) ;
}
}
@Override
public
void
run()
{
//
TODO Auto-generated method stub
try
{
FileInputStream in
=
new
FileInputStream(input) ;
MessageDigest sha
=
MessageDigest.getInstance(
"
SHA
"
) ;
DigestInputStream din
=
new
DigestInputStream(in , sha) ;
int
b ;
while
((b
=
din.read())
!=
-
1
) ;
din.close() ;
byte
[] digest
=
sha.digest() ;
this
.sendDigest(digest) ;
}
catch
(FileNotFoundException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(NoSuchAlgorithmException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e)
{
//
TODO Auto-generated catch block
e.printStackTrace();
}
}
}
3 下面是一个主类
在主类中new 出来每一个线程对象,然后将自身添加到 线程对象的 容器中。
package
cn.bupt.thread;
import
java.io.File;
public
class
ListCallbackDigestUserInterface
implements
DigestListener
{
private
File input ;
private
byte
[] digest ;
public
ListCallbackDigestUserInterface(File input)
{
this
.input
=
input ;
}
public
void
calculatedDigest()
{
ListCallbackDigest cb
=
new
ListCallbackDigest(input) ;
cb.addDigestListener(
this
) ;
Thread t
=
new
Thread(cb) ;
t.start() ;
}
@Override
public
void
digestCalculated(
byte
[] digest)
{
//
TODO Auto-generated method stub
this
.digest
=
digest ;
System.out.println(
this
) ;
}
public
String toString()
{
String result
=
input.getName()
+
"
:
"
;
if
(digest
!=
null
)
{
for
(
int
i
=
0
; i
<
digest.length ;i
++
)
{
result
+=
digest[i]
+
"
"
;
}
}
else
{
result
+=
"
digest not available
"
;
}
return
result ;
}
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
//
TODO Auto-generated method stub
for
(
int
i
=
0
; i
<
args.length ; i
++
)
{
File f
=
new
File(args[i]) ;
ListCallbackDigestUserInterface d
=
new
ListCallbackDigestUserInterface(f) ;
d.calculatedDigest() ;
}
}
}
posted on 2010-07-14 15:06
buptduming
阅读(254)
评论(0)
编辑
收藏
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理