为了账号安全,请及时绑定邮箱和手机立即绑定

多线程java优化

多线程java优化

互换的青春 2021-08-06 10:21:32
在我的程序中,我尝试掌握如何使用 ExecutorService 来优化我的程序。出于某种原因,它在两个 Url 上有点卡住了。该http://sjsu.edu/和https://paypal.com。当它坐在这两个上时,它不会继续执行其他 URL。即使两个域的响应速度不够快,其他 3 个可用线程是否应该不继续?这是如何以最佳方式修复的?public class SequentialPinger {    public static void main(String args[]) throws Exception {        String[] hostList = {"http://crunchify.com", "http://yahoo.com",            "http://www.ebay.com", "http://google.com",            "http://www.example.co", "https://paypal.com",            "http://bing.com/", "http://techcrunch.com/",            "http://mashable.com/", "http://thenextweb.com/",            "http://wordpress.com/", "http://cphbusiness.dk/",            "http://example.com/", "http://sjsu.edu/",            "http://ebay.co.uk/", "http://google.co.uk/",            "http://www.wikipedia.org/",            "http://dr.dk", "http://pol.dk", "https://www.google.dk",            "http://phoronix.com", "http://www.webupd8.org/",            "https://studypoint-plaul.rhcloud.com/", "http://stackoverflow.com",            "http://docs.oracle.com", "https://fronter.com",            "http://imgur.com/", "http://www.imagemagick.org"        };        List<CallableImpl> callList = new ArrayList();        ExecutorService es = Executors.newFixedThreadPool(4);        for (String url : hostList) {            CallableImpl callable = new CallableImpl(url);            callList.add(callable);        }        for (CallableImpl callableImpl : callList) {            System.out.println("Trying to connect to: " + callableImpl.getUrl());            Future<String> lol = es.submit(callableImpl);            System.out.println("status: " + lol.get());        }        es.shutdown();    }}我的 Callable 实现public class CallableImpl implements Callable<String> {    private final String url;    public CallableImpl(String url) {        this.url = url;    }    public String getUrl() {        return url;    }
查看完整描述

3 回答

?
心有法竹

TA贡献1866条经验 获得超5个赞

在你的代码提交Callable到ExecutorService由一个一个,马上招呼Future.get(),这将阻止,直到结果准备好(或异常是在运行时抛出)。


你最好ExecutorService用CompletionSerivce它来包装,一旦它们准备好就提供结果。并将 for 循环拆分为两个循环:一个提交所有Callables,第二个检查结果。


ExecutorService es = Executors.newFixedThreadPool(4);

ExecutorCompletionService<String> completionService = new ExecutorCompletionService<>(es);


for (CallableImpl callableImpl : callList) {

        System.out.println("Trying to connect to: " + callableImpl.getUrl());

        completionService.submit(callableImpl);

}

for (int i = 0; i < callList.size(); ++i) {

    completionService.take().get();   //fetch next finished Future and check its result

}


查看完整回答
反对 回复 2021-08-06
  • 3 回答
  • 0 关注
  • 139 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信