我有两个课程:TNsyncer.java
和DNSClient.java
。
两者都给出相同的结果,但用于获得结果的方法是不同的
现在我有一个班级Main.java
。
我希望通过在Main.java
的两个不同线程中调用该类来填充结果,并在此基础上发布结果:
Exception
),那么等待第二个这两个类都会抛出异常。
我正在做这样的事情:
Object o =new Object();
Thread searchThread = new Thread(new Runnable() {
@Override
public void run() {
info = new DNSClient(getApplicationContext()).checkDNSAnswer(nameSearch.getText().toString());
catch (final Exception ex) { Post some result;}
Thread searchThread2 =new Thread(new Runnable() {
@Override
public void run() {
new TnSyncer().getInstance().sync(nameSearch.getText().toString(),CallerId.getInstance().getPreferences().getCountryCode()) ;
catch (final Exception ex) { Post some result;}
Thread third = new Thread(new Runnable() {
@Override
public void run() {
synchronized(o1){
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
我已经放了我的代码,需要等待一个对象,但问题是如果我等待同一个对象,那么两个线程都不会同时运行
答案 0 :(得分:1)
您可以将TNSyncer
和DNSClient
建模为java.util.concurrent.Callable
接口的实现。可以将Callables
提交给Executor
,您可以使用java.util.concurrent.Future
等待其结果。
如果您想等待任何结果,可以使用java.util.concurrent.CompletionService
。
示例:
class Result {
}
class TnSyncer implements Callable<Result> {
@Override
public Result call() throws Exception {
// TODO: implement
}
}
class DnsClient implements Callable<Result> {
// [...]
}
static Executor executor = new ScheduledThreadPoolExecutor(6);
public static Result lookup(String host) {
ExecutorCompletionService<Result> service = new ExecutorCompletionService<>(executor);
service.submit(new TnSyncer(host));
service.submit(new DnsClient(host));
return service.take().get();
}
Executor
有多个实现,您应该查看它们,确定您希望线程池的大小等等。
答案 1 :(得分:0)
如果你想找到哪一个更快。只需将它们计时并以更好的时间打印方法会更容易。否则,您可能希望查看类似协程的内容,或者更好地管理线程的某种方式。我认为第一种方式适合你想做的更好。
答案 2 :(得分:0)
您可以尝试使用任务和响应队列与在不同线程中运行的“服务”进行通信的方法。以下策略显示了这种方法:
(在你的每个单独的线程任务中,你可以通过检查中止信号或停止和退出信号来改善事情..如果你得到胜利者则使用前者,而当你想要阻止那些时候使用后者线程)