在JAVA中创建新线程时阻止运行方法

时间:2014-11-24 01:06:45

标签: java multithreading sockets

我正在尝试在当前运行的线程的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");
        }
    }
}

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

1 个答案:

答案 0 :(得分:0)

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

注意:如果你得到它,你必须抓住EOFException并突破那个循环。大多数其他IOExceptions也是致命的,除了SocketTimeoutException.