SocketIO多线程卡死问题
0
最近公司需要用mediasoup实现一套媒体服务,本着快速开发所以服务端我还是使用了NodeJS开发,所以选择SocketIO作为信令通道。
但是接入安卓的时候出现一个奇怪的问题就是socket.emit使用ack回调的时候,使用future总是get那里卡死了。
后来看了Java实现的SocketIO的EventThread的代码实现发现里面用的是一个单线程的线程池。
这样就有个问题,就是如果我的ack回调如果调用一个方法这个方法里面也有一个ack回调,就会导致后面的ack等待前一个ack回调结束,get等到就会直接阻塞整个过程。
public static void nextTick(final Runnable task) {
ExecutorService executor;
synchronized (EventThread.class) {
counter++;
if (service == null) {
service = Executors.newSingleThreadExecutor(THREAD_FACTORY);
}
executor = service;
}
executor.execute(new Runnable() {
@Override
public void run() {
try {
task.run();
} catch (Throwable t) {
logger.log(Level.SEVERE, "Task threw exception", t);
throw t;
} finally {
synchronized (EventThread.class) {
counter--;
if (counter == 0) {
service.shutdown();
service = null;
thread = null;
}
}
}
}
});
}