这个问题...不知道是你没说清楚还是我没看明白.不过简单的实现以下还是比较简单的
既然多线程,那么,不同的保存方式就是两个不同的线程.
然后你在调用的时候new 出来这个d对象,然后运行这个d对象,就可以开了一个线程执行了.
interface A{boolean 保存(Entity entity)
}
class B implements A{
public boolean 保存(Entity entity){
//文件保存
}
}
class C implements A{
public boolean 保存(Entity entity){
//数据库保存
}
}
class Main{
public static void main(String[]args){
Entity entity = new Entity()
D d = new D(entity)
new Thread(D).start()
}
}
class D implements Runnable{
private A a
private Entity entity
public D(Entity entity){
this.entity = entity
//用随机数得到1,2,如果是1则将a初始化为B,如果是2,则将a初始化为c
}
public void run(){
a.保存(entity)
}
}
当然还有另外一个思路.
你可以生成两个Entity的队列
一个队列是要用文件保存的任务.一个队列是用数据库保存的队列.
你在保存的时候,仅仅需要往不同的队列里放,然后就由专门的线程来去保存即可
手打~~如果还有问题,可追问.不过大概明天才能回答,我一天回答一两个问题
要看你用的是什么语言,如果是php的,你可以这样考虑,首先一个是将这两个分为两个队列来实现, 一个用来实现消息优先级,一个来实现定时发送
用的是redis的有序集合,用zadd添加时,将score比做是优先级,也可以用时间戳来当做score,用来表示时间
将消息加入优先级的队列,将1,2替换为时间就是定时发送的队列了
$redis = new Redis()
$redis->connect('127.0.0.1', 6379)
$redis->zAdd('zset1', 1, 'message')
$redis->zAdd('zset1', 2, 'message2')
从队列中取出数据
$redis->zRevRangeByScore('zset1, '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)))
这条语句表示从zset1这个队列里按照score从最大(+inf)到最小(-inf)的排序中取出20条,不带score,如果想要从小到大可以用 zRangeByScore
如果你想让这些都运行在命令行下,可以参考下面来,当然这些是经过删减的
<?php
while (true) {
$pid = pcntl_fork()
if ($pid == -1) {
echo date('Y-m-d H:i:s') . "fork失败!\n"
} else if ($pid == 0) {
$redis = new Redis()
$redis->connect('127.0.0.1', 6379)
$redis->zRevRangeByScore('zset1', '+inf', '-inf', array('withscores'=>false, 'limit'=>array(0,20)))
exit
} else {
pcntl_wait($status)
}
}
pcntl_fork是PHP中的生成子进程,当调用该函数时,会返回一个进程pid,当pid为0时表明是在子进程中,所以把要执行的东西全放这里,这样就实现了
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)