2014-09-26 2 views
0

멀티 스레딩에 문제가 있습니다. 이유는 모르지만 스레드는 순서대로 실행됩니다. 클라이언트 - 서버 응용 프로그램이 있습니다. 메시지 교환을 위해 여러 개의 병렬 스레드를 실행해야합니다. 전체 수업이 너무 커서 주요 부분을 보여 드리겠습니다. ") (동의"소켓을 사용한 멀티 스레딩 JAVA

public void run(){ 
    flag=true; 
    System.out.println("Welcome to Server side!"); 

    createLog(); 
    ExecutorService service = Executors.newCachedThreadPool(); 
    ServerSocket servers = null; 
    int n=4600; 
    try{ 
    servers = new ServerSocket(n); 
    } catch(Exception e){ 

    } 
    Socket fromclient = null; 

    while(true){ 
     try { 
      System.out.print("Waiting for a client..."); 
      fromclient = servers.accept(); 
      System.out.println("Client connected."); 
      Callable<ArrayList<Action>> callable = new HandleThread(fromclient); 
      Future<ArrayList<Action>> future = service.submit(callable); 

      list.addAll(future.get()); 
     } catch (Exception e) { 
      System.out.println("Can't accept."); 
      System.exit(-1); 
     } 
    } 
} 

가이 코드는 않습니다 후 새로운 생성 : 서버의

public ArrayList<Action> call() { 
     Thread myThready = new Thread(new Runnable() 
     { 
      public void run() 
      { 
       BufferedReader in; 
       PrintWriter out; 
       try{ 
        Socket fromserver = new Socket(ip, PortID); 
        in = new BufferedReader(new InputStreamReader(fromserver.getInputStream())); 
        out = new PrintWriter(fromserver.getOutputStream(),true); 

        writeLog(query, ID, 0); 
        out.println(query+"ID"+ID); 
        String fserver = in.readLine(); 
        writeLog(fserver, ID, 1); 
        out.println("exit"); 
        out.close(); 
        in.close(); 
        fromserver.close(); 
       } 
       catch (IOException io){ 
        return; 
       } 
      } 
     }); 
     myThready.start(); 
} 

코드 : 클라이언트의

코드 (이 코드는 내가 버튼을 눌러 때마다 실행) 일부 계산을위한 스레드. HandleThread의

코드 :

public ArrayList<Action> call() { 
    BufferedReader in = null; 
    PrintWriter out= null; 
    try { 
     in = new BufferedReader(new 
       InputStreamReader(fromclient.getInputStream())); 
     out = new PrintWriter(fromclient.getOutputStream(),true); 
     String   input,output; 

     System.out.println("Wait for messages."); 

     while ((input = in.readLine()) != null) { 
      //close filewriter thread if input==exit 
      if(input.equalsIgnoreCase("exit")){ 
       break; 
      } 
      System.out.println(input); 
      String[] arr = input.split("ID"); 
      System.out.println("+"+arr[0]); 
      ID = Integer.parseInt(arr[1]); 
      writeLog(arr[0], ID, 0); 
      process(arr[0], ID); 
      out.println(arr[0]); 
      writeLog(arr[0], ID, 1); 
     } 
     out.close(); 
     in.close(); 
     fromclient.close(); 

    } catch(IOException e){ 
     return null; 
    } 
    return list; 
} 

이 작동하지 않는 이유를 모르겠어요. 나는 로그를 가지고 있으며, 하나의 스레드가 다른 스레드 다음에 만 실행되는 것을 볼 수 있습니다. 같은 시간에! 제발, 도와주세요!

+0

이것은 당신이 묻는 버그와는 아무런 관련이 없다. 그러나 적절한 자원 정리를 읽는 것이 좋다. 왜냐하면'HandleThread.call'은 잠재적으로'in'과'out'을 누설 할 수 있기 때문에 pre-java 7. 7에서'close()'호출은 중복됩니다. – Floegipoky

+0

이 'in'과 'out'은 무엇을 의미합니까? – user3051029

+0

당신의'BuffreredReader in'과'PrintWriter out' – Floegipoky

답변

2

Future#get()은 차단 호출입니다.

list.addAll(future.get()); 

호출 스레드는 작업이 완료 될 때까지 대기합니다. 따라서 accept()을 호출하는 서버 스레드는 각 태스크가 다음 태스크에 도달하기 전에 완료 될 때까지 대기합니다.

+0

좋습니다, 고마워요. 그리고 어떻게 다른 스레드를 차단하지 않고 데이터를 얻을 수 있습니까? – user3051029

+0

@user 데이터가 준비되지 않은 경우 데이터를 가져올 수 없습니다. 서버 스레드가 그 정보를 가져야하는 이유는 무엇입니까? –

+0

글쎄, 나는이 데이터를 즉시 얻을 필요가 없다. 어떻게해야합니까? – user3051029