2010-01-06 4 views
4

Java API에 대한 소스 코드가 없어도 API 메소드가 다중 스레드를 생성하는지 알 수 있습니까? Java API를 작성하고 여러 스레드를 작성하는 경우 따라야 할 규칙이 있습니까? 이것은 매우 근본적인 질문 일지 모르지만 요점 질문 인 "Java API가 쓰레드를 생성하고 어떤 Java API가 생성되지 않는지 어떻게 알 수 있습니까?"라는 토론에서 벗어났습니다.스레드를 생성하는 Java API

답변

9

한 가지 방법은 Thread 생성과 SecurityManagerThreadGroup 수정을 허용하지 것입니다. java.lang.SecurityManager.checkAccess(Thread) 방법을 참조하십시오. 자신의 SecurityManager을 구현함으로써 스레드 생성에 대응할 수 있습니다.

다른 질문에 답하려면 : 많은 라이브러리가 예상치 못한 경우에도 새 스레드를 만듭니다. 예를 들어 HTTP 통신용 API는 Keep-Alive 또는 세션 시간 초과를위한 타이머를 만듭니다. Java 2D는 시그널링 스레드를 생성하고있다. Java 자체에는 여러 스레드가 있습니다. Finalizer 스레드. AWT/Swing 이벤트 디스패처 스레드 등.

1

제 경험으로 볼 때 J2EE가 아닌 핵심 Java를보고있는 경우 코어 Java에서 스레드가 생성되었다고 생각할 수있는 유일한 시간은 Swing입니다.

물론 스레드 클래스를 제외하고 핵심 Java API에서 생성되는 다른 스레드의 예는 보지 못했습니다. :)

그러나 다른 라이브러리를 사용하고 있다면 스레드를 만들고있는 것일 수도 있지만 프로필을 작성하지 않으려는 경우 새 스레드가 생성 될 때마다 AspectJ를 사용하여 로그하는 것이 좋습니다. 그리고 무엇을 호출했는지에 대한 스택 추적을 통해 스레드를 생성하는 것을 볼 수 있습니다.

UPDATE :

스윙이 게시물에 따르면, 4 개 스레드를 사용하지만, 그는 또한 당신이 필요한 경우, 스레드를 죽이는 갈 수있는 방법을 설명합니다. 새 스레드를 만들 도서관 결정

http://www.herongyang.com/Swing/jframe_2.html

+0

내가 아는 한, Swing (실제로는 AWT)은 SwingUtilities의'invokeLater' 및'invokeAndWait' 메소드를 통해 액세스하는 단일 이벤트 발송 스레드 만 작성합니다. – Powerlord

+0

@R. Bemrose - Swing이 하나 이상을 생성한다면 확실하지 않습니다. 그렇다고해서 100 % 확신하지 못하기 때문에 "may"를 넣는 것입니다. –

+0

Eclipse의 디버거에서 단일 JFrame을 열 때 적어도 3 개의 스레드 ("AWT-EventQueue", "AWT-Windows", "AWT-Shutdown")를 볼 수 있습니다. 때때로 나는 AWT/Swing을 사용하는 경우에만 "DestroyJavaVM"스레드도 볼 수 있습니다. –

1

말할 방법이 없습니다. 실제로, 나는 당신이 어떤 종류의 제약 된 환경에 있지 않는 한 당신이 평상시와 크게 다르지 않을 것이라고 생각합니다. 좀 더 관련성이 높은 것은 특정 메서드 (AWT Event dispatch thread, 필자가 보았던 경우)에서 실행될 것으로 예상되는 방법으로 작성되었는지 확인하는 것입니다. 코드가 어떤 종류의 명명 규칙을 사용하고 있거나 문서화되어 있지 않다면, 그렇게 할 수있는 방법이 없습니다.

0

활성 스레드를 보려면 jvisualvm 응용 프로그램 ($ JDK/bin 디렉토리에 있음)을 실행하여 모든 로컬 Java 프로세스에 연결하십시오. 스레드 이름, 상태 및 기록을 비롯하여 프로세스에 대한 다양한 정보를 볼 수 있습니다. 더 많은 정보를 얻으려면 here.