我正在尝试为分布式系统创建程序。目前我有一个用于监听连接的线程,一个用于发送的线程和一个用于接收的线程。
我遇到了客户端连接的问题,但仅限于使用断点时。我根本无法弄清楚这个问题!我试图实现一些方法来减慢程序,但是没有任何工作。
如果你们可以看看我会非常感激。
public static void main(String[] args)
{
System.out.println("Server starting on port 5000");
RecievingConnection reciever = new RecievingConnection(5000,0); //Recieving Connection
reciever.start();
SendingConnection sender = new SendingConnection(5001,1); //Sending Connection
sender.start();
while(true){
while(reciever.ready==true){
System.out.println("In");
nodes first = new nodes(reciever.socket,0);
System.out.println("Node created");
first.start();
System.out.println("Client connected on port: " + reciever.socket.getLocalAddress());
nodes second = new nodes(sender.socket,1);
second.start();
reciever.ready=false;
sender.ready=false;
reciever.connectionComplete=true;
sender.connectionComplete=true;
}
}
}
public RecievingConnection(int port, int mode)
{
Serverport = port;
connectionMode = mode;
try{
server = new ServerSocket(port);
server.setSoTimeout(100000);
}
catch(IOException ex)
{
System.out.println(ex);
}
}
public void run(){
while(true){
if(ready == false){
try {
socket = server.accept();
ready = true;
System.out.println("Attempting to connect using port: " + Serverport);
while(connectionComplete == false){
//wait
}
} catch (IOException ex) {
System.out.println(ex);
}
}
}
}
发送线程基本上是相同的代码。知道问题是什么吗? “节点”是每个节点的线程。
答案 0 :(得分:0)
你的问题几乎可以肯定:
while (connectionComplete == false) {
//wait
}
这将永远循环,其他thtreads将不会获得任何CPU时间。它还解释了为什么它在调试中工作 - 这是因为在调试中如果你在断点处停止,任何其他线程都会有时间。
你至少应该这样做:
while (connectionComplete == false) {
//wait
Thread.sleep(0);
}
并且可能使用远大于0
的数字。这将使其他thtreads有机会运行。
我并不是说这会使您的代码正常工作,但它应该会消除当前的问题。
之后还有另一个紧密循环,不会让任何其他线程时间。
while (true) {
if (ready == false) {
将其更改为:
while (true) {
if (ready == false) {
// ...
} else {
// Here too.
Thread.sleep(0);
}
}
答案 1 :(得分:0)
我通过在主线程中添加睡眠来解决它。我认为这是因为主线程优先于子线程?
答案 2 :(得分:0)
您无法在线程之间共享变量。使它们易变,同步或使用像AtomicBoolean这样的CAS类型。
了解它。
https://docs.oracle.com/javase/tutorial/essential/concurrency/interfere.html
http://www.journaldev.com/1061/java-synchronization-and-thread-safety-tutorial-with-examples
https://docs.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html
除了课程"节点"这里没有描述,类应该以大写字母开头。