在应用程序中具有同步和异步行为的有效方法

时间:2014-01-13 06:17:51

标签: java multithreading asynchronous thread-safety

我正在开展一个项目,我应该在其中对我的客户进行synchronousasynchronous行为。一般来说,我们的客户如何工作如下 -

客户将使用userId呼叫我们的客户,我们将从userId构建一个URL并对该URL进行HTTP调用,我们将在点击URL后返回一个JSON字符串。在我们将响应作为JSON字符串返回之后,我们将该JSON字符串发送回给我们的客户。

所以在这种情况下,正如我上面提到的,我需要synchronousasynchronous方法,有些客户会调用executeSynchronous方法来获得相同的功能,而某些客户会调用我们的executeAsynchronous方法可以获取数据。

以下是我的界面 -

public interface Client {

    // for synchronous
    public String executeSynchronous(final String userId);

    // for asynchronous
    public Future<String> executeAsynchronous(final String userId);
}

然后我的SmartClient实现了上面的Client接口。

public class SmartClient implements Client {

    ExecutorService executor = Executors.newFixedThreadPool(5);

    // This is for synchronous call
    @Override
    public String execute(String userId) {

        String response = null;
        Future<String> handle = getHandle(userId);

        try {
            response = handle.get(500, TimeUnit.MILLISECONDS);
        } catch (TimeoutException e) {

        }

        return response;
    }

    // This is for asynchronous call
    @Override
    public Future<String> executeAsync(String userId) {

        return getHandle(userId);

    }

    private Future<String> getHandle(String userId) {
        Future<String> future = null;

        Task task = new Task(userId);
        future = executor.submit(task);

        return future;

    }
}

下面是我将执行实际任务的简单类 -

class Task implements Callable<String> {

    private final String userId;

    public Task(String userId) {
        this.userId = userId;   
    }

    public String call() throws Exception {

        String url = createURL(userId);

        // make a HTTP call to the URL
        RestTemplate restTemplate = new RestTemplate();
        String jsonResponse = restTemplate.getForObject(url, String.class);

        return jsonResponse;
    }

    // create a URL
    private String createURL(String userId) {
        String generateURL = somecode;

        return generateURL;
    }
}

这是解决此问题的正确有效方法吗?那么异常处理呢?我是否需要在任何地方使用任何其他挡块?如果有的话,那么只是一个高级代码示例将帮助我更好地理解。

如果有更好的方法,请告诉我......我还在学习..

1 个答案:

答案 0 :(得分:1)

我会以这种方式实现 executeSynchronous

 public String execute(String userId){
    Task task = new Task(userID);
    return task.call();      //Task executes in the caller thread
 }

我不会使用执行框架,因为调用应该在调用者线程中执行。你认为你的意思是在同步方法中提供一个超时机制,这样调用者就不会被阻塞。如果不是,我认为不需要在同步方法中使用执行框架。