Calling System.exit() is a pretty brutal way of exiting.
Most programs don't need that. Since this is a multithreaded program, you need to stop the execution of these threads. There are less brutal ways to do it, like, letting them exit the loops they are in, and run to their respective ends. Then they can be joined with the main thread.
Disclaimer: I'm much less experienced with multithreaded programming than you are. I might be wrong.
https://github.com/goxr3plus/XR3Player/blob/b222ce496f47b1ffc121e768b4f3f24999906213/src/main/java/com/goxr3plus/xr3player/application/MainExit.java#L96
Calling System.exit() is a pretty brutal way of exiting. Most programs don't need that. Since this is a multithreaded program, you need to stop the execution of these threads. There are less brutal ways to do it, like, letting them exit the loops they are in, and run to their respective ends. Then they can be joined with the main thread.
Disclaimer: I'm much less experienced with multithreaded programming than you are. I might be wrong.