java 中异步进程的技术和设计
Technologies and design for asynchronous processes in java
我目前正在使用 Java 在 Restfull 架构下开发应用程序。在我的网络休息服务、另一个网络服务肥皂和 android 客户端之间的交互过程中,我遇到了一个非常大的问题。
经过多次测试,我发现客户端有时会在操作仍在处理时返回失败,并且对于上述两个服务之间的服务消费也是如此,只是因为这种情况调用是阻塞的。
为了解决这个问题,我会这样进行:
当客户端向服务器发送操作时,服务器会立即响应请求已处理。然后客户每次都必须测试他的操作状态,直到好的它通知用户。
现在我担心的是我会为此创建一个线程;但是我找不到好的设计和技术...提前感谢您的帮助。
您将监听来自客户端的调用以轮询状态(在服务器端点之一上),并让您的消费者线程实现 getStatus
方法,同时更新 [=21= 中的状态] 方法。关于消费者线程,粗略的实现如下所示:
public class ConsumerThread implements Runnable{
private int status = 0;
private Random rand = new Random();
private final CountDownLatch startSignal;
public ConsumerThread(CountDownLatch latch){
this.startSignal = latch;
}
public int getStatus() {
return status;
}
private void setStatus(int status) {
this.status = status;
}
public void run() {
try {
this.startSignal.await();
while (true){
this.setStatus(rand.nextInt(10));
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
然后尝试一个简单的 main 方法(我实现了一个 CountDownLatch 让我的所有线程同时启动,这不是强制性的):
public class ThreadMain{
private static List<ConsumerThread> consumers = new ArrayList<ConsumerThread>();
public static void main(String[] args) {
int NUM_THREAD = 15;
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD);
CountDownLatch latch = new CountDownLatch(NUM_THREAD);
ConsumerThread buffer = new ConsumerThread(latch);
for (int i = 0; i < NUM_THREAD; i++){
consumers.add(buffer);
executor.execute(buffer);
latch.countDown();
buffer = new ConsumerThread(latch);
}
for (int i = 0; i < 100; i++){
System.out.println("Status for Thread 0: " + getStatusId(0));
System.out.println("Status for Thread 14: " + getStatusId(14));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static int getStatusId(int index){
return consumers.get(index).getStatus();
}
}
示例输出:
Status for Thread 0: 5
Status for Thread 14: 0
Status for Thread 0: 7
Status for Thread 14: 2
Status for Thread 0: 7
Status for Thread 14: 4
Status for Thread 0: 6
Status for Thread 14: 3
我目前正在使用 Java 在 Restfull 架构下开发应用程序。在我的网络休息服务、另一个网络服务肥皂和 android 客户端之间的交互过程中,我遇到了一个非常大的问题。
经过多次测试,我发现客户端有时会在操作仍在处理时返回失败,并且对于上述两个服务之间的服务消费也是如此,只是因为这种情况调用是阻塞的。
为了解决这个问题,我会这样进行: 当客户端向服务器发送操作时,服务器会立即响应请求已处理。然后客户每次都必须测试他的操作状态,直到好的它通知用户。
现在我担心的是我会为此创建一个线程;但是我找不到好的设计和技术...提前感谢您的帮助。
您将监听来自客户端的调用以轮询状态(在服务器端点之一上),并让您的消费者线程实现 getStatus
方法,同时更新 [=21= 中的状态] 方法。关于消费者线程,粗略的实现如下所示:
public class ConsumerThread implements Runnable{
private int status = 0;
private Random rand = new Random();
private final CountDownLatch startSignal;
public ConsumerThread(CountDownLatch latch){
this.startSignal = latch;
}
public int getStatus() {
return status;
}
private void setStatus(int status) {
this.status = status;
}
public void run() {
try {
this.startSignal.await();
while (true){
this.setStatus(rand.nextInt(10));
}
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}
然后尝试一个简单的 main 方法(我实现了一个 CountDownLatch 让我的所有线程同时启动,这不是强制性的):
public class ThreadMain{
private static List<ConsumerThread> consumers = new ArrayList<ConsumerThread>();
public static void main(String[] args) {
int NUM_THREAD = 15;
ExecutorService executor = Executors.newFixedThreadPool(NUM_THREAD);
CountDownLatch latch = new CountDownLatch(NUM_THREAD);
ConsumerThread buffer = new ConsumerThread(latch);
for (int i = 0; i < NUM_THREAD; i++){
consumers.add(buffer);
executor.execute(buffer);
latch.countDown();
buffer = new ConsumerThread(latch);
}
for (int i = 0; i < 100; i++){
System.out.println("Status for Thread 0: " + getStatusId(0));
System.out.println("Status for Thread 14: " + getStatusId(14));
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static int getStatusId(int index){
return consumers.get(index).getStatus();
}
}
示例输出:
Status for Thread 0: 5
Status for Thread 14: 0
Status for Thread 0: 7
Status for Thread 14: 2
Status for Thread 0: 7
Status for Thread 14: 4
Status for Thread 0: 6
Status for Thread 14: 3