--- a/net/minecraft/server/PlayerConnectionUtils.java
+++ b/net/minecraft/server/PlayerConnectionUtils.java
@@ -14,6 +14,7 @@
     public static <T extends PacketListener> void ensureMainThread(Packet<T> packet, T t0, IAsyncTaskHandler<?> iasynctaskhandler) throws CancelledPacketHandleException {
         if (!iasynctaskhandler.isMainThread()) {
             iasynctaskhandler.execute(() -> {
+                if (MinecraftServer.getServer().hasStopped() || (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect)) return; // CraftBukkit, MC-142590
                 if (t0.a().isConnected()) {
                     packet.a(t0);
                 } else {
@@ -23,5 +24,10 @@
             });
             throw CancelledPacketHandleException.INSTANCE;
         }
+        // CraftBukkit start - SPIGOT-5477, MC-142590
+        else if (MinecraftServer.getServer().hasStopped() || (t0 instanceof PlayerConnection && ((PlayerConnection) t0).processedDisconnect)) {
+            throw CancelledPacketHandleException.INSTANCE;
+        }
+        // CraftBukkit end
     }
 }