多线程并发请求检测url是否可用,有一个可用停掉所有的线程实现Callable接受线程返回值

来源:互联网 发布:卖韩国女装的淘宝店 编辑:程序博客网 时间:2024/06/05 11:19

创建两个文件

第一个:TestCallable.java

package com.iba.cxx.web.controller.App;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.Callable;/** * Created by wangzhi on 2017/12/13. */public class TestCallable implements Callable {    private String oid;    TestCallable(String oid) {        this.oid = oid;    }    @Override    public Object call() throws MalformedURLException {        System.out.println("处理之前"+oid);        //进行网络请求        URL realUrl = new URL(oid);        // 打开和URL之间的连接        try {            HttpURLConnection connection = (HttpURLConnection)realUrl.openConnection();            int responseCode = connection.getResponseCode();            if(responseCode==200){                System.out.println("正常请求"+oid);                responseCode = 0;                return "1";            }else {                System.out.println("请求错误"+oid);                return "2";            }        } catch (Exception e) {            System.out.println("异常"+oid);            return "2";        }    }}

第二个:testMain.java

private static Boolean hasValue = false;public static void main(String[] args) throws ExecutionException, InterruptedException {    long lss = System.currentTimeMillis();    System.out.println(System.currentTimeMillis()+"");    int count = 0;    //创建一个线程池    ExecutorService pool = Executors.newFixedThreadPool(4);    //创建两个有返回值的任务    Callable c1 = new TestCallable("http://www.souppu.com");    Callable c2 = new TestCallable("http://www.soauhu.com");    Callable c3 = new TestCallable("http://www.sqouhu.com");    Callable c4 = new TestCallable("http://www.baidu.com");    //执行任务并获取Future对象    Future f1 = pool.submit(c1);    Future f2 = pool.submit(c2);    Future f3 = pool.submit(c3);    Future f4 = pool.submit(c4);    //从Future对象上获取任务的返回值,并输出到控制台    System.out.println(">>>"+f1.get().toString());    System.out.println(">>>"+f2.get().toString());    if (f1.get().toString() == "1"||f2.get().toString() == "1"||f3.get().toString()=="1"||f4.get().toString()=="1"){        count++;        hasValue = true;        System.out.println(hasValue+" "+count);        //关闭线程池        pool.shutdown();    }    System.out.println("返回值"+hasValue);    System.out.println(System.currentTimeMillis()-lss+"");}

阅读全文
0 0
原创粉丝点击