Skip to content

Commit

Permalink
Merge pull request #93 from cdqtzrc/master
Browse files Browse the repository at this point in the history
/ping命令部分代码可能导致一些对象无法被垃圾回收器回收
  • Loading branch information
1024-byteeeee authored Mar 4, 2024
2 parents e5d0425 + a2a7a66 commit 38126f8
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 28 deletions.
18 changes: 13 additions & 5 deletions run/options.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
version:2586
version:2975
autoJump:false
autoSuggestions:true
chatColors:true
Expand All @@ -11,45 +11,49 @@ discrete_mouse_scroll:false
invertYMouse:false
realmsNotifications:false
reducedDebugInfo:false
snooperEnabled:false
showSubtitles:false
touchscreen:false
fullscreen:false
bobView:false
toggleCrouch:false
toggleSprint:false
darkMojangStudiosBackground:false
hideLightningFlashes:false
mouseSensitivity:0.40316900610923767
fov:0.0
screenEffectScale:0.5
fovEffectScale:1.0
gamma:1.0
renderDistance:12
simulationDistance:12
entityDistanceScaling:1.0
guiScale:4
particles:1
maxFps:260
difficulty:2
graphicsMode:0
ao:2
prioritizeChunkUpdates:0
biomeBlendRadius:4
renderClouds:true
resourcePacks:["vanilla","programer_art"]
resourcePacks:["vanilla"]
incompatibleResourcePacks:[]
lastServer:124.227.80.185:25227
lang:zh_cn
soundDevice:
chatVisibility:0
chatOpacity:1.0
chatLineSpacing:0.019366197288036346
textBackgroundOpacity:0.5
backgroundForChatOnly:true
hideServerAddress:false
advancedItemTooltips:true
pauseOnLostFocus:true
pauseOnLostFocus:false
overrideWidth:0
overrideHeight:0
heldItemTooltips:true
chatHeightFocused:1.0
chatDelay: 0.0
chatDelay:0.0
chatHeightUnfocused:0.44366195797920227
chatScale:0.6214788556098938
chatWidth:1.0
Expand All @@ -63,9 +67,13 @@ mouseWheelSensitivity:1.0
rawMouseInput:true
glDebugVerbosity:1
skipMultiplayerWarning:true
skipRealms32bitWarning:false
hideMatchedNames:true
joinedFirstServer:true
hideBundleTutorial:false
syncChunkWrites:true
showAutosaveIndicator:true
allowServerListing:true
key_key.attack:key.mouse.left
key_key.use:key.mouse.right
key_key.forward:key.keyboard.w
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,26 +65,12 @@ public static void register(CommandDispatcher<ServerCommandSource> dispatcher) {
}

private static int executePing(PlayerEntity player, String targetIpOrDomainName, int pingQuantity) {
Thread pingThread = new Thread(() -> {
int successfulPings = 0;
int failedPings = 0;
long totalDelay = 0;
try {
boolean isFirstPing = true;
for (int i = 0; i < pingQuantity; i++) {
long delay = ping(player, targetIpOrDomainName, isFirstPing);
if (delay >= 0) {
successfulPings++;
totalDelay += delay;
} else {
failedPings++;
}
isFirstPing = false;
Thread.sleep(1000);
}
sendFinishMessage(player, pingQuantity, successfulPings, failedPings, successfulPings > 0 ? totalDelay / successfulPings : 0);
} catch (InterruptedException ignored) {}
});
PingThread thread = (PingThread) PING_THREADS.get(player);
// 如果重新ping时之前的线程没有执行完,则先将原有的线程终止
if (thread != null) {
thread.setInterrupted();
}
Thread pingThread = new PingThread(pingQuantity,player,targetIpOrDomainName);
pingThread.start();
PING_THREADS.put(player, pingThread);
return 1;
Expand Down Expand Up @@ -132,9 +118,9 @@ private static long ping(PlayerEntity player, String targetIpOrDomainName, boole
private static int stopPing(PlayerEntity player) {
String stopPing = translator.tr("stop_ping").getString();
String activePingIsNull = translator.tr("active_ping_is_null").getString();
Thread pingThread = PING_THREADS.get(player);
if (pingThread != null && pingThread.isAlive()) {
pingThread.interrupt();
PingThread pingThread = (PingThread)PING_THREADS.get(player);
if (pingThread != null) {
pingThread.setInterrupted();
player.sendMessage(LiteralTextUtil.compatText(String.format("§b%s §4%s", MSG_HEAD, stopPing)), false);
} else {
player.sendMessage(LiteralTextUtil.compatText(String.format("§b%s §4%s", MSG_HEAD, activePingIsNull)), false);
Expand All @@ -160,4 +146,46 @@ private static void sendFinishMessage(PlayerEntity player, int totalPings, int s
false
);
}
static class PingThread extends Thread {
private volatile boolean interrupted = false;
private final int pingQuantity;
private final PlayerEntity player;
private final String targetIpOrDomainName;
private PingThread(int pingQuantity, PlayerEntity player, String targetIpOrDomainName) {
this.pingQuantity = pingQuantity;
this.player = player;
this.targetIpOrDomainName = targetIpOrDomainName;
}
@Override
public void run() {
int successfulPings = 0;
int failedPings = 0;
long totalDelay = 0;
try {
boolean isFirstPing = true;
for (int i = 0; i < pingQuantity; i++) {
if (interrupted){
return;
}
long delay = ping(player, targetIpOrDomainName, isFirstPing);
if (delay >= 0) {
successfulPings++;
totalDelay += delay;
} else {
failedPings++;
}
isFirstPing = false;
Thread.sleep(1000);
}
sendFinishMessage(player, pingQuantity, successfulPings, failedPings, successfulPings > 0 ? totalDelay / successfulPings : 0);
} catch (InterruptedException ignored) {
} finally {
// 线程执行完毕后释放资源
PING_THREADS.remove(player);
}
}
private void setInterrupted(){
this.interrupted = true;
}
}
}

0 comments on commit 38126f8

Please sign in to comment.