为什么这段代码只能在带有断点的调试模式下工作? (IDE调试器)
问题描述:
你好我正在编写一个简单的telnet(后来即将有一个自定义的telnet客户端解释命令)命令和控制服务器在纯java 和我有一些代码,只有当我有调试器并在正确的地方断点这是奇怪为什么这段代码只能在带有断点的调试模式下工作? (IDE调试器)
代码:
主营:
package LiteDoor;
import java.io.File;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import LiteDoor.net.AcceptTelnetClient;
public class Main {
public static final String VERSION = "v0.0.1";
public static File scripts = new File("scripts");
public static ArrayList<AcceptTelnetClient> conns = new ArrayList<AcceptTelnetClient>();
public static void main(String args[]) throws Exception
{
File autorun = new File(scripts.getAbsolutePath()+File.separatorChar+"autorun.litescript");
if (!autorun.exists()) {
scripts.mkdirs();
autorun.createNewFile();
}
ServerSocket Soc=new ServerSocket(666);
while(true)
{
Socket CSoc=Soc.accept();
AcceptTelnetClient ob=new AcceptTelnetClient(CSoc);
}
}
}
AcceptTelnetClient:
package LiteDoor.net;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.Socket;
import LiteDoor.Main;
import LiteDoor.io.MyBufferedWriter;
public class AcceptTelnetClient extends Thread {
Socket ClientSocket;
public boolean master;
public String slaveCmd = null;
public AcceptTelnetClient(Socket CSoc) throws Exception {
Main.conns.add(this);
ClientSocket=CSoc;
System.out.println("Client Connected ...");
BufferedReader in = new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
@SuppressWarnings("resource")
MyBufferedWriter out = new MyBufferedWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
out.writeln("MASTER/SLAVE?");
switch(in.readLine().toUpperCase()) {
case("MASTER"):
master = true;
break;
case("SLAVE"):
master = false;
break;
}
int i=0;
while(i<200) {
out.newLine();
i++;
}
out.flush();
start();
}
public void run() {
try {
BufferedReader in=new BufferedReader(new InputStreamReader(ClientSocket.getInputStream()));
@SuppressWarnings("resource")
MyBufferedWriter out = new MyBufferedWriter(new OutputStreamWriter(ClientSocket.getOutputStream()));
out.writeln("");
if (!master) {
BufferedReader fr = new BufferedReader(new FileReader(Main.scripts.getAbsolutePath()+File.separatorChar+"autorun.litescript"));
String line = fr.readLine();
while(line != null) {
if (!line.startsWith("#") && line != "") {
out.writeln(line);
}
line = fr.readLine();
}
fr.close();
}
boolean loop = true;
while(loop) {
if (master) {
String cmd = in.readLine();
if(cmd.startsWith("quit")) {
loop=false;
} else {
System.out.println("Master says: " + cmd);
for (AcceptTelnetClient con : Main.conns) {
if (!con.master) {
synchronized (con) {
con.slaveCmd = cmd;
}
}
}
}
} else {
if (slaveCmd != null) {
synchronized (this) { // Here needs to be an breakpoint
out.writeln(slaveCmd);
slaveCmd = null;
}
}
}
}
ClientSocket.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
ClientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
shloud发生什么:
客户端1连接到服务器类型的“奴隶” 并等待,直到一些命令得到sended它
客户端2在“主”连接类型并发送一些命令 是那么shloud得到sended到连接为“奴”
所有客户端会发生什么: 客户端1连接为从 客户端2连接的主机发送一个命令,但是奴隶不得到它(它不会在Telnet客户端窗口显示)
代码工作正常只有在调试器,并与断点正确的地方
PS是的,我试着用搜索引擎却一无所获
答
TL; DR ...
你不能肯定的是,正在运行的线程获取布尔标志主控的更新值,声明挥发性代替...
public volatile boolean master;
非常感谢您的工作! – lukas2005
欢迎您! –