2016-07-27 8 views
1

저는 Scala를 처음 사용합니다. 스칼라에서 멀티 스레딩을 배우고 있습니다. Scala에서 멀티 스레딩의 한 가지 방법은 scala.actors이지만 요즘에는 사용되지 않습니다. 따라서 새로운 방법은 scala.concurrent 또는 akka.actor을 사용하는 것입니다. scala.concurrent을 사용하고 싶습니다. 시나리오 : 여러 클라이언트의 연결을 동시에 허용하고 다시 응답하는 채팅 서버를 만들고 싶습니다. 내가하려고 방법은 다음과 같습니다Futures for Multithreading을 사용하는 방법?

while(true) { 
     socket = serverSocket.accept() 
     os = new PrintStream(socket.getOutputStream) 
     br = new BufferedReader(new InputStreamReader(socket.getInputStream())) 

     val newClient = Future { 
     os.println("\n\nPlease Enter the Table name to be Extracted\t:") 
     restr = br.readLine() 

     println("data received from ["+socket.getInetAddress()+"] ["+socket.getPort()+"] and TableName ["+ restr +"]\n") 
     new Extractor().extract(dbURL,userId,password,restr,os) 
     } 
    val clientFormed= newClient.isCompleted 
     println("New Client Connection ? ["+clientFormed+"]") 
    } 

하지만, 프로그램을 실행 한 후 출력은 말한다 :

New Response made [false] 

는 선물이 실행되지 않았 음을 의미합니다. 잠도 작동하지 않습니다. 나는 여기에 뭔가 부족한 것을 알고 있지만 알아낼 수는 없다.

UPDATE 나는 (사실) 미래의 내부 것은 올바른 방법이 아니다 동안 알고 있지만 진정한 동안은 서버의 지속적인 실행을 위해 필요하다. 나는 내 길을 잘못 알고있다. 내가 원하는 것은 그것을하는 올바른 방법은 무엇입니까?

답변

3

response은 앞으로 while(true)으로 시작하는 미래입니다. 그것이 완료 될 수있는 방법은 없습니다.

+0

그럼 무엇을 사용해야합니까? –

+0

@YashBhardwaj 당신은 미래가 무엇인지 이해합니까? 그것은 미래의 어떤 시점에서 완료 될 계산의 결과를 담을 상자와 같습니다. 코드에서 계산에는 무한 루프가 포함되어 있으므로 계산이 수행되지 않습니다. 루프를 제거하고 전체'serverSocket.accept()'부분을'Future'에서 제거하십시오. 여기에 설명하는 것이 너무 많습니다. – Jesper

+0

@Jesper 좋습니다. 미래를 오해 한 것 같습니다. 그 죄송합니다. 채팅방과 같은 멀티 스레드 서버를 만들고 싶습니다. 'scala.actors'를 사용하고 있지만 더 이상 사용되지 않는 [이] 비디오 (https://www.youtube.com/watch?v=dX_pgQuEB2o#t=24.868041)를 보았습니다. 미래는 동시성에 대한 새로운 개념입니다 (저는 믿습니다). 그래서 그것이 문제입니다. –