2014-11-24 67 views
0

我正尝试在当前正在运行的线程的运行方法中创建新线程。但新线程没有开始,它阻止了当前正在运行的线程的执行。在JAVA中创建新线程时阻止运行方法

运行当前正在运行的线程的方法。

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"); 
     } 
    } 
} 

我搜索了这个的相关答案对谷歌的数字,但我没有得到的IT解决方案。任何人都可以指导我解决这个问题?

+0

这是否编译:'while(true){'?这是每一个打印:'System.out.println(“执行从这里开始”);'? – 2014-11-24 01:10:31

+2

你确定它不是阻塞的构造函数吗? – 2014-11-24 01:11:31

+0

@HovercraftFullOfEels:它不打印任何东西。 – Renaissance 2014-11-24 01:17:21

回答

0

您的ClientSideTempClient类在其构造函数中创建并连接Socket,这会延迟您的循环。 Socket和对象流应该在它自己的run()方法中创建,即在它自己的线程上。

注意你必须抓住EOFException,如果你得到它,就跳出这个循环。大多数其他IOExceptions也是致命的,除了SocketTimeoutException.

相关问题