2010-01-22 3 views
3

이전에 자바 스레드에 대한 쿼리를 게시했습니다. (link text)Java threads doubt

내가받은 대답에 따라, 나는 그것을 구현하기로 결정했습니다. 그래서 2cpu 코어가있는 머신에서이 비트의 코딩을 수행했습니다.

import java.net.*; 
import java.io.*; 


public class thready implements Runnable{ 
private Socket num; 

public thready(Socket a) { 
    this.num=a; 
} 
public void run() { 
    try { 
     BufferedInputStream is = new BufferedInputStream(num.getInputStream()); 
     System.out.println("Connected to port"+num); 
    } catch (IOException ex) { 
     //Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 
public static void main(String [] args) 
{ 
    int port = 80; 
    int port1= 81; 
    //int count = 0; 
    try{ 

    ServerSocket socket1 = new ServerSocket(port); 
    ServerSocket socket2 = new ServerSocket(port1); 
    while (true) { 
    Socket connection = socket1.accept(); 
    Socket connection1 = socket2.accept(); 

    Runnable runnable =new thready(connection); 
    Runnable run= new thready(connection1); 
    Thread t1=new Thread(runnable); 
    Thread t2=new Thread(run); 
    t1.start(); 
    t2.start(); 
    } 
    } 
    catch(Exception e) 
    { 

    } }} 

이제 임 테스트 하이퍼 터미널을 사용하여이 코드 조각을 다음과 890 포트 81 (하이퍼 터미널의 두 인스턴스를 사용하고) 모두 포트에 연결하고 그리고 난 그것을 이해 예상되는 동작이어야하는 코드는 어떤 포트 (80 또는 81)에 연결되자 마자 "포트에 연결된 포트 번호"가 인쇄되어야합니다. 그러나이 코드 조각에서 여기에 도착하는 출력은 필요한 출력이 인쇄되지 않고 하나의 포트에만 연결되면 다른 포트 다음에 하나씩 연결되면 두 포트 모두 출력됩니다. 연결되어있다. 따라서이 두 스레드가 동시에 실행되고 있는지 또는 실행이이 두 스레드간에 번갈아 가는지에 대한 초기 혼동으로 이어진다.

어떤 제안이라도 도움이 될 것입니다.

건배

+0

자바 API 문서를 읽지 않는 경우 +1 : – willcodejavaforfood

답변

8

당신은 스레드를 시작하기 전에 accept를 호출하고 있습니다. accept은 연결이 설정 될 때까지 차단되므로 사용자가하는 행동을 보는 이유입니다. 여러 포트에서 수신하려면 []에 대한 스레드를 만들고 [accept]이 수신 대기중인 스레드에서 연결을 하나씩 반환하거나 처리 할 때 통신 스레드를 시작해야합니다.

[1] 이것은 학습 중에 사용해야하는 ServerSocket을 직접 사용하는 경우에만 적용됩니다. java.nio 패키지 및 그 서브 패키지는 동일한 스레드 내의 다수의 소켓을 청취하는데 사용될 수있는 다중화 비 차단 I/O와 함께 사용하기위한 클래스를 포함한다.

3

코드

Socket connection = socket1.t(); 
Socket connection1 = socket2.accept(); 

는 방법을 차단 Socket.accept를 이용한다. javadoc를 참조하십시오 :

이 소켓에 연결할 연결을 수신하고이를 수락합니다. 연결 방법은 블록입니다. 연결이 될 때까지

3

당신은 지금 .accept() 블록이 2 줄

Socket connection = socket1.accept(); 
Socket connection1 = socket2.accept(); 

있습니다.

코드가 위의 2. 행에서 대기하는 것을 의미합니다. 연결이 이루어질 때까지 '연결'스레드를 시작하지 마십시오.

5

스레드를 시작한 다음 차단하기 전에 많은 초기화 작업을 수행하고 있습니다.

모든 코드를 실행 파일로 옮깁니다. 그런 다음 connection 및 connection1과 같은 복제 된 변수 이름을 피하고 Thready가 소유 한 객체를 갖습니다.

0

제안에 따라 코드를 약간 수정하고 실행 해 보았습니다. 다음은이 (내 생각) 동시 스레드를 구현 않는 수정 된 생성자와 실행 방법

public thready(int a) { 
    this.num=a; 
} 
public void run() { 
    try { 
     ServerSocket socket1 = new ServerSocket(num); 
     while(true){ 
     Socket connection = socket1.accept(); 
     BufferedInputStream is = new BufferedInputStream(connection.getInputStream()); 
     System.out.println("Connected to port"+num); 
     } 
    } catch (IOException ex) { 
     //Logger.getLogger(thready.class.getName()).log(Level.SEVERE, null, ex); 
    } 


} 

입니다. 의견을 보내 주셔서 감사합니다.

+0

질문 텍스트로 편집하여 답변을 수락하는 것이 좋습니다. – blank