如何在构造函数中同时解析URL?

时间:2016-12-29 00:36:42

标签: java parallel-processing jsoup

我有一个名为" Parser"可用于从网址获取价格并将其解析为整数。

然后我有其他类使用这些变量来创建对象。问题是,因为它是连续运行的,所以非常慢。

如何让他们并行解析网址?

public class Parser {
    public static int getPrice(String url) {
        String price = "";
        try {
            Document doc = Jsoup.connect(url).get();
            price = doc.select("h3").select("span").attr("title");
        } catch (IOException e) {
            e.printStackTrace();
        }
        return parseInt(price);
    }

    public static double parseDouble(String parseMe) {
        NumberFormat ukFormat = NumberFormat.getNumberInstance(Locale.UK);
        double parsed = 0;
        try {
            parsed = ukFormat.parse(parseMe).doubleValue();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return parsed;
    }
}

//Here is an example of the class
public class Example(){
    private int field1, field2;

    public Example(String url1, String url2){
        field1=Parser.getPrice(url1);
        field2=Parser.getPrice(url2);
    }
}

2 个答案:

答案 0 :(得分:1)

如果您希望getPrice调用异步运行,可以使用ExecutorService,如下所示:

public Example(String url1, String url2) {
    // Create executorService.
    ExecutorService executorService = Executors.newWorkStealingPool();

    // Submit both tasks to executorService.
    Future<Integer> future1 = executorService.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            return Parser.getPrice(url1);
        }
    });
    Future<Integer> future2 = executorService.submit(new Callable<Integer>() {
        @Override
        public Integer call() throws Exception {
            return Parser.getPrice(url2);
        }
    });

    // Shutdown executorService. (It will no longer accept tasks, but will complete the ones in progress.)
    executorService.shutdown();

    // Handle results of the tasks.
    try {
        // Note: get() will block until the task is complete
        field1 = future1.get();
        field2 = future2.get();
    } catch (InterruptedException e) {
        // TODO Handle it
    } catch (ExecutionException e) {
        // TODO Handle it
    }
}

答案 1 :(得分:0)

我有完全相同的情况,对我来说,我必须让他们在同一个函数中解析两个URL,而不是返回一个Integer,而是返回一个包含两个整数的数组,而且速度更快。 在您的情况下,我建议使用CyclicBarrier以您的代码看起来像这样的方式:

final CyclicBarrier cb = new CyclicBarrier(2); // the parameter 2 is the number of threads that will invode the await method

    long startTime = System.nanoTime();// this is just the start time to measure how many it took
    Thread t1 = new Thread(){
        public void run(){
            try {
                cb.await();
                int field1 = Parser.getPrice(url1);
            } catch (InterruptedException e) {  
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }};

        Thread t2 = new Thread(){
            public void run(){
                try {
                    cb.await();
                    int field2 = Parser.getPrice(url2);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (BrokenBarrierException e) {

                    e.printStackTrace();
                }

            }};

            t1.start();
            t2.start();
    long endTime = System.nanoTime();// end time of execution
    long duration = (endTime - startTime);
    System.out.println(duration);