java - 在应用程序中实现同步和异步行为的有效方法

标签 java multithreading asynchronous thread-safety

我正在开发一个项目,在该项目中我应该使客户端的同步异步行为。一般来说,我们的客户将如何工作如下 -

客户将使用 userId 调用我们的客户端,我们将从该 userId 构造一个 URL,并对该 URL 进行 HTTP 调用,我们将收到一个 JSON 字符串点击网址后。在我们收到 JSON 字符串形式的响应后,我们会将该 JSON 字符串发送回给我们的客户。

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

下面是我的界面 -

public interface Client {

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

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

然后我有了实现上述 Client 接口(interface)的 SmartClient

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;
    }
}

这是解决此问题的正确且有效的方法吗?那么异常处理又如何呢?我需要在任何地方添加任何其他捕获 block 吗?如果有的话,那么一个高级代码示例将帮助我更好地理解。

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

最佳答案

我会这样实现executeSynchronous:

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

我不会使用执行框架,因为调用应在调用者线程中执行。 Bu认为您的意思是在同步方法中提供超时机制,以便调用者不会被阻塞。如果不是我认为同步方法中没有必要使用执行框架。

关于java - 在应用程序中实现同步和异步行为的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21085009/

相关文章:

java - 为什么 Java 中的 volatile 不更新变量的值?

database - 在加载 Express 4.x 之前启动数据库连接

.net - PLINQ 有异步版本吗?

java - Java中的十进制到十六进制转换器

java - 如何使用 JCalendar 选择数组中的元素?

c++ - C++的不同对象在线程中会互相干扰吗?

javascript - 使 Meteor.methods 同步和异步

java - 函数返回接口(interface)是什么意思?

java - 在java中从数据库中检索法语字符

java - 是否可以在单元测试期间禁用 Spring 的 @Async?