2009-07-15 5 views
1

DataInputStream에서 read()를 호출하면 데이터를 기다리는 CPU 사이클을 사용합니까 아니면 현재 스레드를 생성하고 데이터가 도착했는지 신호를 보내는 인터럽트로 깨우습니까?java : datainputstream : 데이터를 기다리는 동안 읽기 호출이 프로세서 시간을 차지합니까?

내 동기는 스트림 리더가 자체 스레드에 있어야하는지 여부를 결정하는 것입니다. CPU 시간을 차지하는 블로킹 읽기는 주 스레드를 정지 시키므로 이상적이지 않습니다.

관련 질문 : 메소드가 블로킹으로 설명 될 때 기다리는 동안 스레드가 생성된다는 것을 암시합니까? 아니면 계약/보증이 없습니까? 끊임없이 데이터를 검사/폴링하는 방식으로 나에게 소리를냅니다.

답변

1

CPU주기를 차지하지 않지만 블로킹 중이므로 아무 것도 실행되지 않습니다.

가능한 경우 Java의 NIO (비 차단 항목)를 사용하십시오. 그렇지 않으면 별도의 스레드를 갖는 것이 이상적 일 수 있습니다.

3

일반적으로 I/O는 데이터를 사용할 수있을 때까지 읽기 스레드를 차단하고 다른 스레드는 자유롭게 실행됩니다. 데이터가 도착하면 판독기가 차단 해제됩니다.

블로킹은 차단 된 스레드가 차단 해제되기를 기다리고 다른 스레드는 실행되는 것을 의미합니다. 은 일반적으로 데이터를 폴링하는 동안 반복되는 바쁜 대기 코드 (잘 설계된 코드 및 Java 런타임이 아님)를 찾습니다.

한편

, 난 그냥 차단에 의해 흡수되는 사이클의 일정 금액이 있습니다

1

:-(인수 했어 코드에서 모든 것을 보았다.있다 thread 스위치. 도움이되지 않는 데이터로 가득 찬 캐시 관련 문제 아마도, 다중 스레드 시스템에서 문맥 전환없이 스레드를 신속하게 차단 해제 할 수 있도록하려면 회전 시간이 짧습니다.

이렇게 작은 비트가 있습니다. 오버 헤드가 있지만 문제가되지 않아야합니다. DataInputStream을 사용한다는 사실은 여기 또는 여기에 없습니다. 특정 성능 문제가있는 경우 주소 그. I/O 작업의 CPU 성능보다 I/O 성능이 더 중요 할 수 있습니다.

0

(다른 답변에 따르면) 스레딩 관점에서 문제가 없습니다. 블로킹에서 CPU 사용을 최소화하거나 최소화하지 마십시오.

그러나 높은 I/O 성능을 기대하지 마십시오. InputStream 읽기 방법이 동기화되어 있고, 차단하고, 모든 바이트에 대해 안전 검사를 수행하기 때문에 속도가 매우 느립니다. 대량 데이터를 읽는 경우 NIO를 살펴 보거나 한 번에 큰 바이트 []를 읽으십시오. 1K-8K는 어느 정도 표준입니다.

관련 문제