如何从两个线程之间最快的检索结果
How to retrieve the result from the fastest between two threads
我的 Android 应用程序的主要用途是非常快速地获取一个 URL,我需要实现两种获取该网站的方法:
- 1:通过使用普通网络的普通请求
- 2:通过代理服务器
由于有时在没有代理的情况下加载网站会导致 http 错误,我想同时尝试两种方式并选择最快的方式。
这是我到目前为止尝试过的:
final boolean[] thread1Done = {false};
final boolean[] thread2Done = {false};
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteViaProxy();
thread1Done[0] = true;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteWithoutProxy();
thread2Done[0] = true;
}
}).start();
//Wait until both threads are done and at least one has managed to fetch the website
while (thread1Done[0] == false || thread2Done[0] == false || website.length() == 0) {
Thread.sleep(10);
}
//... continue
以上只是伪代码,因此为了这个示例,我们可以假设至少有一个线程将始终设法成功获取网站。
但我认为一定有比只用 while() 等待结果更好的方法。
感谢您的帮助。
您需要支持哪个版本的Android?你可以使用 CompletableFuture 吗?如果是,您可以使用以下模式:
CompletableFuture<Website> future = new CompletableFuture<>();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteViaProxy();
future.complete(website);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteWithoutProxy();
future.complete(website);
}
}).start();
//return the result fromt he faster thread
Website result = future.get();
我的 Android 应用程序的主要用途是非常快速地获取一个 URL,我需要实现两种获取该网站的方法:
- 1:通过使用普通网络的普通请求
- 2:通过代理服务器
由于有时在没有代理的情况下加载网站会导致 http 错误,我想同时尝试两种方式并选择最快的方式。
这是我到目前为止尝试过的:
final boolean[] thread1Done = {false};
final boolean[] thread2Done = {false};
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteViaProxy();
thread1Done[0] = true;
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteWithoutProxy();
thread2Done[0] = true;
}
}).start();
//Wait until both threads are done and at least one has managed to fetch the website
while (thread1Done[0] == false || thread2Done[0] == false || website.length() == 0) {
Thread.sleep(10);
}
//... continue
以上只是伪代码,因此为了这个示例,我们可以假设至少有一个线程将始终设法成功获取网站。
但我认为一定有比只用 while() 等待结果更好的方法。
感谢您的帮助。
您需要支持哪个版本的Android?你可以使用 CompletableFuture 吗?如果是,您可以使用以下模式:
CompletableFuture<Website> future = new CompletableFuture<>();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteViaProxy();
future.complete(website);
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
website = fetchWebsiteWithoutProxy();
future.complete(website);
}
}).start();
//return the result fromt he faster thread
Website result = future.get();