Run方法在JAVA中创建新线程时被阻止
我试图在当前正在运行的线程的run方法中创建一个新线程。但新线程尚未启动,它正在阻止当前正在运行的线程的执行Run方法在JAVA中创建新线程时被阻止,java,multithreading,sockets,Java,Multithreading,Sockets,我试图在当前正在运行的线程的run方法中创建一个新线程。但新线程尚未启动,它正在阻止当前正在运行的线程的执行 public void run() { while(true){ try{ Message message = (Message)objIn.readObject(); System.out.println("Received msg:"+message);
public void run() {
while(true){
try{
Message message = (Message)objIn.readObject();
System.out.println("Received msg:"+message);
if(message.type.equals("connection")){
if(message.content.equals("true")){
System.out.println("connection successful");
InetAddress senderIp = message.senderIp;
InetAddress receiverIp = message.receiverIp;
System.err.println(senderIp+"------"+receiverIp);
if(senderIp.getHostAddress().equals(receiverIp.getHostAddress())){
//first member of ring topology
System.err.println("first member");
}else{
System.err.println("not the first member");
ClientSideTempClient clientTemp = new ClientSideTempClient(receiverIp);
Thread obj1 = new Thread(clientTemp);
obj1.start();
System.out.println("after starting local client tread...");
}
}else{
System.out.println("something went wrong");
}
}
}catch(Exception e){
System.out.println("Exception:"+e);
}
}
}
当前正在运行的线程的Run方法
public void run() {
while(true){
try{
Message message = (Message)objIn.readObject();
System.out.println("Received msg:"+message);
if(message.type.equals("connection")){
if(message.content.equals("true")){
System.out.println("connection successful");
InetAddress senderIp = message.senderIp;
InetAddress receiverIp = message.receiverIp;
System.err.println(senderIp+"------"+receiverIp);
if(senderIp.getHostAddress().equals(receiverIp.getHostAddress())){
//first member of ring topology
System.err.println("first member");
}else{
System.err.println("not the first member");
ClientSideTempClient clientTemp = new ClientSideTempClient(receiverIp);
Thread obj1 = new Thread(clientTemp);
obj1.start();
System.out.println("after starting local client tread...");
}
}else{
System.out.println("something went wrong");
}
}
}catch(Exception e){
System.out.println("Exception:"+e);
}
}
}
新线程的类:
ClientSideTempClient.java
public class ClientSideTempClient implements Runnable{
public Socket socket;
public ObjectInputStream objIn;
public ObjectOutputStream objOut;
public ClientSideTempClient(InetAddress serverIp){
try{
System.err.println("trying to connect"+serverIp.getHostAddress());
String ipAddress = serverIp.getHostAddress();
socket = new Socket(ipAddress, 9010);
objOut = new ObjectOutputStream(socket.getOutputStream());
objOut.flush();
objIn = new ObjectInputStream(socket.getInputStream());
}catch(Exception e){
System.err.println("Exception in ClientSideTempClient"+e);
}
}
public void sendMessageToLocalServer(Message msg){
try {
objOut.writeObject(msg);
objOut.flush();
System.out.println("Outgoing : "+msg.toString());
}catch(Exception e){
System.out.println("Exception in chatroom_client:"+e);
}
}
@Override
public void run() {
While(true){
System.out.println("Execution started here");
}
}
}
我在谷歌上搜索了很多相关的答案,但我没有找到答案。有谁能指导我解决这个问题吗?您的
ClientSideTempClient
类在其构造函数中创建并连接Socket
,这会延迟循环。Socket
和对象流应该在其自己的run()
方法中创建,即在其自己的线程上创建
注意:您必须捕获
EOFException
,如果得到它,就必须跳出该循环。除了SocketTimeoutException之外,大多数其他的IOException
也是致命的。是否编译:而(true){
?是否每次都打印:System.out.println(“此处开始执行”);
?你确定阻塞的不是构造函数吗?@HovercraftFullOfEels:它没有打印任何内容。@SotiriosDelimanolis:是的……构造函数中有些东西工作不正常……!@SotiriosDelimanolis:执行在objIn=new ObjectInputStream(socket.getInputStream())处停止;