接口设计实现不同线程之间数据传递

首先,我需要实现的功能是  java代码调用本地cmd进行 ping ip操作。对ping 的结果分析并 发送邮件。这里最大 的问题是如何  在 邮件线程 和 ping的线程 之间 ip的传递。


设计思路是先定接口(暂名为interface1  和 interface2),先不要管如何实现ip传递。

1.邮箱线程实现接口 interface1,  当创建邮箱线程实例的时候,重写interface1的方法 这些方法的 逻辑是 尝试接收对应ip。   创建完邮箱线程之后,把邮箱线程的引用赋给 接口interface1,这样相当于interface1也等到了实例化。


2.创建ping线程实现cmd的ping 操作。在ping线程里面 放入 接口2 interface2 ,并且使interface2 的实现了 在创建对象的时候   对构造传入接口1interface1的实例,这样在interface2 里面就能拿到接口1的实例,并使用接口1的方法。    接口interface2 的重写的方法的逻辑是 尝试发送ip。


3.这样在 ping的线程里面,就可以通过接口2 interface2  把 ip传递给  接口interface1,那么就能在邮箱线程里面通过接口interface1  得到传递过来的ip  实现发邮箱逻辑。


在整个流程里面   邮箱线程 (实现并重写) 接口1interface1 ,   ping线程  (包含) 接口2inteface2,   接口2 内部有 接口1 的实例引用 (能操作接口1的方法)。

当 ping线程  把ip传递给 接口2 之后  ,  接口2  在方法 里面 能 实现  将ip 传递给 接口1,  然后 接口1 就能把ip 传递给 邮件线程。


public static void main(String[] args) {
List<String> iplist = Arrays.asList(configuration.getString("ip.list").split(";"));
List<Thread> threads = new ArrayList<Thread>();
// 开启Email线程扫描
MailThread mailThread = new MailThread();
IPStrategyHandler ipStrategyHandler = mailThread;
mailThread.start();

for (String ip : new HashSet<String>(iplist)) { // 去除重复IP
if (StringUtils.isBlank(ip)) {
continue;
}
PingThread t = new PingThread(ip.trim());   //开启ping线程
t.setStrategy(new StrategyImpl(ipStrategyHandler));   //ping线程内部 传入 接口2
t.start();
threads.add(t);
}

...

}


public interface IPStrategyHandler {    //接口1  尝试获取ip


public void broken(IPStatus ip); //中断


public void reconnect(IPStatus ip); //重连

public void delay(IPStatus ip); //延迟


}


public class MailThread extends Thread implements IPStrategyHandler {   //在邮箱线程里面  重写接口1的方法是 给 对应的集合添加ip
public MailThread() {
this.brokenMap = new Hashtable<String, IPStatus>();
this.reconnectList = new ArrayList<IPStatus>();
this.delayMap = new Hashtable<String, IPStatus>();
}

...

}


public interface Strategy {  //接口2   传递ip出去


public void analysisStatus(IPStatus ip,int errorCount);

public void reconnect(IPStatus ip);

public void broken(IPStatus ip);

public void delay(IPStatus ip);
}


public class StrategyImpl implements Strategy {   //接口2 的实现类  在创建实例的时候传入  接口1的实例引用   

public StrategyImpl(IPStrategyHandler ipStrategyHandler) {
this.ipStrategyHandler = ipStrategyHandler;
}

@Override
public void reconnect(IPStatus ip) {
ipStrategyHandler.reconnect(ip);//传递重连ip
}


@Override
public void broken(IPStatus ip) {
ipStrategyHandler.broken(ip); //传递中断ip
}


@Override
public void delay(IPStatus ip) {
ipStrategyHandler.delay(ip);
}

...

}


public class PingThread extends Thread {   //ping线程内部 包含 接口2 

...

private Strategy strategy;

public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值