Socket.io пропускает потоки после закрытия программыJAVA

Программисты JAVA общаются здесь
Anonymous
Socket.io пропускает потоки после закрытия программы

Сообщение Anonymous »

Я использую io.socket:socket.io-client:2.1.0 в своем Java-приложении libGDX и запускаю его на рабочем столе с помощью Android Studio.
Проблема в том, что когда я закрываю окно приложения, приложение все еще активно.
Я заметил, что это происходит только, если я использую Socket.io, даже если я правильно закрываю окно приложения. сокета, как сказано в официальном FAQ, а также освободив и другие вещи.
В build.gradle:core я уже пытался использовать более новую версию okhttp:< /p>

Код: Выделить всё

[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
eclipse.project.name = appName + '-core'

dependencies {
api "com.badlogicgames.gdx:gdx-box2d:$gdxVersion"
api "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
api "com.badlogicgames.gdx:gdx:$gdxVersion"
api "com.badlogicgames.gdx:gdx-tools:$gdxVersion"
api ('com.squareup.okhttp3:okhttp:4.12.0')
api ('io.socket:engine.io-client:2.1.0') {
// excluding org.json which is provided by Android
exclude group: 'org.json', module: 'json'
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
}
api ('io.socket:socket.io-client:2.1.0') {
exclude group: 'com.squareup.okhttp3', module: 'okhttp'
}
}
GameScreen.java:

Код: Выделить всё

MyGame game;

private Socket socketIo;
private Dispatcher dispatcher;
private OkHttpClient okHttpClient;

public class GameScreen extends InputAdapter implements Screen
{
public GameScreen(final MyGame game) {
this.game = game;

URI uri = URI.create("wss://mydomain.app:8080");
dispatcher = new Dispatcher();
okHttpClient = new OkHttpClient.Builder()
.dispatcher(dispatcher)
.readTimeout(1, TimeUnit.MINUTES) // important for HTTP long-polling
.build();
IO.Options options = new IO.Options();
options.callFactory = okHttpClient;
options.webSocketFactory = okHttpClient;
options.auth = singletonMap("serverOffset", "0");
options.timeout = 10000;
options.reconnectionAttempts = 3;
socketIo = IO.socket(uri, options);
socketIo.connect();
}

@Override
public void dispose() {
if(socketIo != null) {
socketIo.disconnect();

socketIo.off();
socketIo.offAnyIncoming();
socketIo.offAnyOutgoing();
if(okHttpClient != null) {
okHttpClient.connectionPool().evictAll();
okHttpClient.dispatcher().cancelAll();
okHttpClient.dispatcher().executorService().shutdownNow();
okHttpClient.connectionSpecs().clear();
}

socketIo = null;
}
}
}
Если я запустил jstack [appProcddId], он выведет следующее:

Код: Выделить всё

Full thread dump OpenJDK 64-Bit Server VM (17.0.9+9-Ubuntu-120.04 mixed mode, sharing):

Threads class SMR info:
_java_thread_list=0x00007fb898001920, length=24, elements={
...
}

"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=1,12ms elapsed=16,96s tid=0x00007fb92815c090 nid=0x4c24 waiting on condition  [0x00007fb92c78f000]
java.lang.Thread.State: RUNNABLE
at java.lang.ref.Reference.waitForReferencePendingList(java.base@17.0.9/Native Method)
at java.lang.ref.Reference.processPendingReferences(java.base@17.0.9/Reference.java:253)
at java.lang.ref.Reference$ReferenceHandler.run(java.base@17.0.9/Reference.java:215)

"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0,47ms elapsed=16,96s tid=0x00007fb92815d480 nid=0x4c25 in Object.wait()  [0x00007fb92c68e000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@17.0.9/ReferenceQueue.java:155)
- locked  (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@17.0.9/ReferenceQueue.java:176)
at java.lang.ref.Finalizer$FinalizerThread.run(java.base@17.0.9/Finalizer.java:172)

"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0,64ms elapsed=16,95s tid=0x00007fb928162a30 nid=0x4c26 waiting on condition  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Service Thread" #5 daemon prio=9 os_prio=0 cpu=1,48ms elapsed=16,95s tid=0x00007fb928163df0 nid=0x4c27 runnable  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Monitor Deflation Thread" #6 daemon prio=9 os_prio=0 cpu=2,21ms elapsed=16,95s tid=0x00007fb928165210 nid=0x4c28 runnable  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"C2 CompilerThread0"  #7 daemon prio=9 os_prio=0 cpu=1656,00ms elapsed=16,95s tid=0x00007fb928166bd0 nid=0x4c29 waiting on condition  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task

"C1 CompilerThread0" #10 daemon prio=9 os_prio=0 cpu=1430,74ms elapsed=16,95s tid=0x00007fb928168110 nid=0x4c2a waiting on condition  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE
No compile task

"Sweeper thread" #11 daemon prio=9 os_prio=0 cpu=0,12ms elapsed=16,95s tid=0x00007fb928171580 nid=0x4c2b runnable  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Notification Thread" #12 daemon prio=9 os_prio=0 cpu=0,17ms elapsed=16,92s tid=0x00007fb928179490 nid=0x4c2c runnable  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Common-Cleaner" #13 daemon prio=8 os_prio=0 cpu=1,02ms elapsed=16,91s tid=0x00007fb92817ccb0 nid=0x4c2e in Object.wait()  [0x00007fb90814e000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(java.base@17.0.9/ReferenceQueue.java:155)
- locked  (a java.lang.ref.ReferenceQueue$Lock)
at jdk.internal.ref.CleanerImpl.run(java.base@17.0.9/CleanerImpl.java:140)
at java.lang.Thread.run(java.base@17.0.9/Thread.java:840)
at jdk.internal.misc.InnocuousThread.run(java.base@17.0.9/InnocuousThread.java:162)

"Timer-0" #18 prio=5 os_prio=0 cpu=0,69ms elapsed=10,04s tid=0x00007fb929767790 nid=0x4c4f in Object.wait()  [0x00007fb8619d8000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"Timer-2" #21 prio=5 os_prio=0 cpu=0,42ms elapsed=9,62s tid=0x00007fb929762b60 nid=0x4c52 in Object.wait()  [0x00007fb8aef61000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"OkHttp TaskRunner" #23 daemon prio=5 os_prio=0 cpu=6,87ms elapsed=9,36s tid=0x00007fb7dc08de30 nid=0x4c56 waiting on condition  [0x00007fb861ad9000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.9/Native Method)
- parking to wait for   (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.9/LockSupport.java:252)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@17.0.9/SynchronousQueue.java:401)
at java.util.concurrent.SynchronousQueue.poll(java.base@17.0.9/SynchronousQueue.java:903)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17.0.9/ThreadPoolExecutor.java:1061)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.9/ThreadPoolExecutor.java:1122)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.9/ThreadPoolExecutor.java:635)
at java.lang.Thread.run(java.base@17.0.9/Thread.java:840)

"Okio Watchdog" #24 daemon prio=5 os_prio=0 cpu=1,72ms elapsed=9,35s tid=0x00007fb7dc091a80 nid=0x4c57 waiting on condition  [0x00007fb860fd4000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.9/Native Method)
- parking to wait for   (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.9/LockSupport.java:252)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(java.base@17.0.9/AbstractQueuedSynchronizer.java:1757)
at okio.AsyncTimeout$Companion.awaitTimeout$okio(AsyncTimeout.kt:308)
at okio.AsyncTimeout$Watchdog.run(AsyncTimeout.kt:186)

"Timer-3"  #25 prio=5 os_prio=0 cpu=0,35ms elapsed=9,30s tid=0x00007fb92976ba90 nid=0x4c58 in Object.wait()  [0x00007fb860ed3000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"Timer-4" #32 prio=5 os_prio=0 cpu=0,39ms elapsed=8,99s tid=0x00007fb9297d5690 nid=0x4c5f in Object.wait()  [0x00007fb861cdb000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"Timer-5" #36 prio=5 os_prio=0 cpu=0,37ms elapsed=8,67s tid=0x00007fb9297f0070 nid=0x4c64 in Object.wait()  [0x00007fb860acf000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"Timer-6" #38 prio=5 os_prio=0 cpu=0,34ms elapsed=8,35s tid=0x00007fb9297ca960 nid=0x4c67 in Object.wait()  [0x00007fb860bd0000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"OkHttp TaskRunner" #42 daemon prio=5 os_prio=0 cpu=5,06ms elapsed=8,22s tid=0x00007fb7f003fc50 nid=0x4c6b waiting on condition  [0x00007fb8608cd000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.9/Native Method)
- parking to wait for   (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.9/LockSupport.java:252)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@17.0.9/SynchronousQueue.java:401)
at java.util.concurrent.SynchronousQueue.poll(java.base@17.0.9/SynchronousQueue.java:903)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17.0.9/ThreadPoolExecutor.java:1061)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.9/ThreadPoolExecutor.java:1122)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.9/ThreadPoolExecutor.java:635)
at java.lang.Thread.run(java.base@17.0.9/Thread.java:840)

"Timer-7" #43 prio=5 os_prio=0 cpu=0,37ms elapsed=8,04s tid=0x00007fb9297ee330 nid=0x4c6c in Object.wait()  [0x00007fb8609ce000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"OkHttp TaskRunner" #46 daemon prio=5 os_prio=0 cpu=0,22ms elapsed=8,03s tid=0x00007fb7c0001b10 nid=0x4c6f waiting on condition  [0x00007fb8606cb000]
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@17.0.9/Native Method)
- parking to wait for    (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@17.0.9/LockSupport.java:252)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@17.0.9/SynchronousQueue.java:401)
at java.util.concurrent.SynchronousQueue.poll(java.base@17.0.9/SynchronousQueue.java:903)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@17.0.9/ThreadPoolExecutor.java:1061)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@17.0.9/ThreadPoolExecutor.java:1122)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@17.0.9/ThreadPoolExecutor.java:635)
at java.lang.Thread.run(java.base@17.0.9/Thread.java:840)

"Timer-8" #47 prio=5 os_prio=0 cpu=0,45ms elapsed=7,72s tid=0x00007fb9297cbb20 nid=0x4c70 in Object.wait()  [0x00007fb8607cc000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(java.base@17.0.9/Native Method)
- waiting on  (a java.util.TaskQueue)
at java.lang.Object.wait(java.base@17.0.9/Object.java:338)
at java.util.TimerThread.mainLoop(java.base@17.0.9/Timer.java:537)
- locked  (a java.util.TaskQueue)
at java.util.TimerThread.run(java.base@17.0.9/Timer.java:516)

"DestroyJavaVM" #56 prio=5 os_prio=0 cpu=3331,05ms elapsed=5,86s tid=0x00007fb9280173f0 nid=0x4c18 waiting on condition  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"Attach Listener" #57 daemon prio=9 os_prio=0 cpu=0,45ms elapsed=0,10s tid=0x00007fb898000d20 nid=0x4c8c waiting on condition  [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

"VM Thread" os_prio=0 cpu=9,78ms elapsed=16,97s tid=0x00007fb928158100 nid=0x4c23 runnable

"GC Thread#0" os_prio=0 cpu=9,65ms elapsed=17,01s tid=0x00007fb9280780f0 nid=0x4c19 runnable

"GC Thread#1" os_prio=0 cpu=9,57ms elapsed=15,44s tid=0x00007fb8a8005d50 nid=0x4c45 runnable

"GC Thread#2" os_prio=0 cpu=9,41ms elapsed=15,44s tid=0x00007fb8a8006800 nid=0x4c46 runnable

"GC Thread#3" os_prio=0 cpu=3,53ms elapsed=15,44s tid=0x00007fb8a80072b0 nid=0x4c47 runnable

"GC Thread#4" os_prio=0 cpu=9,38ms elapsed=15,44s tid=0x00007fb8a8007d60 nid=0x4c48 runnable

"GC Thread#5" os_prio=0 cpu=6,61ms elapsed=15,44s tid=0x00007fb8a800d3d0 nid=0x4c49 runnable

"GC Thread#6" os_prio=0 cpu=0,33ms elapsed=10,07s tid=0x00007fb8a800bbc0 nid=0x4c4c runnable

"GC Thread#7" os_prio=0 cpu=0,25ms elapsed=10,07s tid=0x00007fb8a800c5c0 nid=0x4c4d runnable

"G1 Main Marker" os_prio=0 cpu=0,10ms elapsed=17,01s tid=0x00007fb928086f80 nid=0x4c1a runnable

"G1 Conc#0" os_prio=0 cpu=0,07ms elapsed=17,01s tid=0x00007fb928087ef0 nid=0x4c1b runnable

"G1 Refine#0" os_prio=0 cpu=0,15ms elapsed=17,01s tid=0x00007fb92812a130 nid=0x4c1c runnable

"G1 Service" os_prio=0 cpu=4,72ms elapsed=17,01s tid=0x00007fb92812b030 nid=0x4c1d runnable

"VM Periodic Task Thread" os_prio=0 cpu=14,46ms elapsed=16,92s tid=0x00007fb92817ade0 nid=0x4c2d waiting on condition

JNI global refs: 18, weak refs: 0
Как видите, эти темы, связанные с Socket.io, все еще активны:

Код: Выделить всё

OkHttp TaskRunner
Okio Watchdog
Я не могу просто выполнить System.exit(0) (это работает хорошо), потому что я опубликую приложение в PlayStore и этот код не рекомендуется для приложений Android.
Итак, как же окончательно завершить работу socket.io и всех связанных с ним потоков?

Подробнее здесь: https://stackoverflow.com/questions/784 ... he-program

Вернуться в «JAVA»