2010-02-16 5 views
2

У меня есть следующий код, в котором я запускаю прослушиватель потоков, который должен постоянно прослушивать любые входящие TCP-сообщения после запуска этого потока. Я хочу, чтобы основной поток был используется для отправки сообщений, но как только я запускаю listen.run(), кажется, что основной поток больше не запускается. Я хочу, чтобы он продолжал запускать цикл while, но он так и не дошел до него.java: порождение новой нити вызывает остановку исходной нити

package tcpclient; 

import java.io.*; 
import java.net.*; 
import java.net.UnknownHostException; 
import java.util.Scanner; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class client { 
//instance vars 
static Socket cSocket =null; 
static PrintWriter out = null; 
static BufferedReader in = null; 

//server info 
static String serverName = null; 
static int serverPort = 0; 
static String userName=null; 

//listening vars 
static Thread listen; 
static String incoming=null; 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) throws IOException { 
    try { 
     System.out.println("\n\n\nTCP Chat Client\n\nEnter server name:"); 
     Scanner scan = new Scanner(System.in); 

     //get server info from user 
     serverName = scan.nextLine(); 

     System.out.println("\nEnter port number:"); 
     serverPort = Integer.parseInt(scan.nextLine()); 


     System.out.println("\nEnter your username:"); 
     userName = scan.nextLine(); 

     //make connection to server 
     cSocket = new Socket(serverName, serverPort); 
     out = new PrintWriter(cSocket.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); 

     //send username to server 
     out.println(userName); 

     //start listening 
     listen = new Thread(){ 
      @Override 
       public void run(){ 
       try { 
        incoming = in.readLine(); 
        while (!(incoming.equals(null))) { 
         System.out.print(incoming); 


incoming = in.readLine(); 

        } 
       } catch (IOException ex) { 
        Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 

     }; 
     listen.run(); 
     String rcvrname="wefwef"; 
     String message=null; 
     //start messaging 
     while(!(rcvrname.equals("exit"))){ 
      System.out.println("Enter reciever name"); 
      out.println(scan.nextLine()); 
      System.out.println("Enter message"); 
      out.println(scan.nextLine()); 

     } 
     out.close(); 
     in.close(); 
     cSocket.close(); 

    } 

    catch (UnknownHostException ex) { 
     System.err.println("\ncan't find that host\n"); 

    } 

    catch (IOException ex) { 
     Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); 
    } 

    finally{ 
     in.close(); 
     out.close(); 
     cSocket.close(); 
    } 


} 

}

+1

просто из любопытства, почему вы определяете новую тему в середине main()? Не лучше ли кодировать его в отдельном частном классе? – chama

+0

chama, потому что я ленивый: D – n0ob

ответ

9

Вы хотите:

listen.start(); 

не

listen.run(); 

Также предпочтительным способом сделать это, так как Java 5 является использование ExecutorService:

Runnable listen = new Runnable() { 
    public void run() { ... } 
} 
ExecutorService exec = Executors.newSingleThreadExecutor(); 
exec.submit(listen); 

и когда вы хотите, чтобы остановить его:

exec.shutdown(); 
exec.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 

или просто:

exec.shutdownNow(); 
3

Вот проблема:

listen.run(); 

Вы не должны вызывать run() сам! Вы должны позвонить start(), это порождает поток, вызывая run(), просто вызовите функцию.

Смежные вопросы