如何在线程

时间:2018-06-18 01:39:57

标签: java multithreading

我正在调用一些通过某些回调函数返回响应的服务。 我使用线程来调用此服务,以便它在自己的进程中运行。 该线程在我的主线程中调用。

我的问题是如何在调用此服务时优化忙碌的while循环。 有时服务失败,可以继续重试循环,直到收到一个好的响应。

public class ProcessResponse extends Thread
    boolean isOK = false;

    public void responseReturned(Response response){
        //more code
        if(response.OK){
            //process result
            isOK = true; 
        }
    }

    public void run(){
        while(true){
            // call service
            Thread.sleep(1000);
            if(isOK)
                break;
        }
    }
}

更新2: 我的下一步思路就是使用latch

public class ProcessResponse extends Thread
    boolean isOK = false;
    CountDownLatch latch = new CountDownLatch(1);


    public void responseReturned(Response response){
        //more code
        if(response.OK){
            //process result
            isOK = true;
        }
        latch.countDown();
    }

    public void run(){
        while(!isOK){
            // call service

            try {
                latch.await();
            } catch (InterruptedException e) {
                //handle interruption
            }
            latch = new CountDownLatch(1);
        }
    }
}

没有睡眠命令,但我不确定是否重新初始化锁存器是一种好方法。该服务有时需要时间才能返回。 注意..我还没试过这个代码..我只是输入它所以我不确定这是否会起作用。

2 个答案:

答案 0 :(得分:2)

JAVA 5中有许多选项可以使用:

1)循环障碍:    创建一个2的循环屏障,并且当通过主线程调用responseReturned时,你可以简单地设置循环屏障等待函数来实现它。它的优点是您可以一次又一次地重复使用相同的屏障,而无需重新初始化它。

2)CountDown Latch    创建一个倒计时锁存器1,一旦responseReturned调用latch的倒计时功能,运行中的await功能将允许它向前移动。它的缺点是你必须重新初始化latch,以防你想重用它。

3)ExecutorService   您还可以使用ExecutorService并可以调用future对象get方法等待,直到返回正确的响应。

4)信号量您还可以在调用服务之前使用获取并在responseReturned中释放它。在运行中,您可以再次调用aquire post call等待直到返回响应。

所有这些都将允许您以几乎相似的效率实现功能。

希望有所帮助。

答案 1 :(得分:0)

未来的接口可以用于这种类型的交互以及我猜测的ExecutorService。提交请求后,您可以设置回调的超时等。

Future<String> futureTask = executorService.submit(callable);
String result = null;
try {
    result = futureTask.get(500, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
    e.printStackTrace();
}