2010-04-10 7 views
4

CPU 사용량/ROM 사용량/RAM 사용량 - 일반적으로 내 응용 프로그램에서 사용하는 모든 시스템 리소스 - 누가 사용하지 않습니까? :)두 프로그램이 Java에서 서로 어떻게 대화 할 수 있습니까?

이 이유로 저는 응용 프로그램의 나머지 부분에서 환경 설정 창을 분할하고 환경 설정 창을 독립적 인 프로그램으로 실행하려고합니다.

환경 설정 프로그램은 Property 파일에 쓰고 (전혀 문제가되지 않음) 주 프로그램에 "업데이트 신호"를 보내야합니다. 즉, 발견 한 업데이트 방법 (즉, 작성한 것)을 호출해야합니다. Main 클래스에서.

기본 프로그램의 기본 프로그램에서 업데이트 방법을 호출하려면 어떻게해야합니까?

다른 방법으로는, 시스템 리소스를 가져 오는 환경 설정 윈도우를 빌드하는 방법입니다 그냥 창이 나타납니다?

이 접근법은 프로그램을 분리하고 서로 이야기하게합니다 (어떻게 든) - 프로그램 속도를 높이는 올바른 방법입니까?

+5

ROM 사용? 뭐? –

+3

프로세스는 비용이 많이 드는 리소스 집약적 인 작업입니다. 그들은 자유롭지 않습니다. 환경 설정 패널은 아마도 최소한의 요구 사항 일 것입니다. 여러 프로세스에 대한 특정 필요가 없다면, 상황을 복잡하게하지 마십시오. 가능한 한 간단하게하십시오. 자원 집중을 줄이기 위해 자원을보다 집중적으로 사용하도록 제안합니다. 그러지 마. –

답변

9

당신의 소리는 Premature Optimisation입니다. 장난감 응용 프로그램이 아닌 다른 것을 작성하는 경우에는 최적화가 실제로 실제 문제를 해결하고 있다고 확신하는 것이 중요합니다. 프로그램이 느리게 실행됩니까? 그렇다면 프로파일 러를 통해 실행 시키거나 성능 저하가 발생한 부분을 식별하십시오.

수행하려는 작업이 성능 문제를 해결할 것이라는 것을 알고 있다면 다른 프로세스가 아닌 다른 스레드에서 구성 요소를 실행하는 것이 좋습니다. 그런 다음 구성 요소가 서로를 차단하지 않으면 멀티 코어 프로세서를 활용할 수 있으며 네트워크 소켓 등을 통한 프로세스 간 통신의 복잡성과 성능 오버 헤드를 감당할 수 없습니다.

+3

별도의 프로그램을 가지고 동일한 프로세스에서 환경 설정을 설정하면 전체 리소스를 덜 사용하게됩니다. 당신이 끝나면 그것을 찢어 버려라. 전체 파일 크기는 더 작아지고 전체 메모리 공간은 더 작아지며 CPU 리소스가 덜 필요합니다. Java는 사용을 끝내면 여분의 리소스를 해제합니다. –

+0

+1 조기 최적화를 위해 – Cam

+0

UI 코드가 궁극적으로 모두 동일한 스레드에서 실행되므로 별개의 스레드가 여기서는 적합하지 않다고 생각합니다. 실제로 UI 스레드에서 UI 코드를 호출하면 이상한 일이 발생할 수 있습니다. 내 대답을 보라. –

1

주 창에 ServerSocket을 만들고 기본 설정이있는 응용 프로그램을 일반 Socket에 연결할 수 있습니다. 사용하는 프로토콜은 매우 간단 할 수 있지만 ... 두 번째 방법을 찾아야합니다 : 표시 될 때 시스템 리소스를 사용하는 환경 설정 창을 작성 하시겠습니까? 사용자가 환경 설정을 수행 할 때까지

그렇게하려면 창 모든 IT 자원을 구축해야 액션, 파일을 저장 (또는 주요 응용 프로그램에 대한 내용을 전달) 기본 설정의 모든 자원을 및 처분 창에 모든 참조를 액세스 할 수 없도록 설정합니다. 가비지 컬렉터가 나머지를 처리합니다.

6

소켓을 사용하여 앞뒤로 통신 할 수 있습니다. Here's a tutorial of how to do something similar..

불행히도 이것이 CPU 사용량, RAM 등을 최소화하는 데 도움이되지 않는다고 생각합니다. CPU 사용량, RAM 사용량 등이 늘어날 수 있습니다. 하나 대신 2 개의 JVM을 실행해야하기 때문에 . 엄청나게 복잡한 환경 설정 창을 가지고 있지 않다면 걱정할 필요가없는 많은 리소스를 사용하지 않을 것입니다. 네트워크 통신을 추가함으로써 어떤 이점도 추가하지 않고 더 많은 복잡성을 추가하는 것입니다.

편집 :

이 책 색녀 리치 클라이언트를 읽었다면

,이 책의 주요 포인트 중 하나는 풍부한 효과는 리소스를 많이 할 필요가 없다는 것입니다.이 책의 대부분은 많은 리소스를 사용하지 않고 멋진 효과를 앱에 추가하는 방법을 보여주는 데 전념합니다. 책 전반에 걸쳐 그들은 오랜 시간이 걸리는 것과 그렇지 않은 것을 보여주기 위해 모든 것을 시간을 정하는 데 매우 신중합니다. 앱을 적게 사용하려는 경우 중요합니다. 앱을 작성하고 속도가 느린 부분을 확인하고 속도가 느린 특정 항목에 타이밍 코드를 추가하고 코드의 특정 부분을 빠르게 처리하십시오. 실제로 더 빨랐는지 확인하려면 타이밍 코드를 확인하십시오. 린스하고 반복하십시오. 그렇지 않으면 어떤 차이도 내지 않을 수있는 최적화를 수행하고 있습니다. 코드를 타이밍하지 않으면 최적화를 수행 한 후에 코드가 빨라지더라도 코드가 빨라질 필요가 있는지 알 수 없습니다.

다른 사람들은 속성 창을 별도의 스레드에로드하는 것에 대해 언급했습니다. Swing에는 모든 픽셀 그림을 화면에 표시하는 one thread called the EDT 만 있다는 것을 기억하는 것이 중요합니다. 화면상의 픽셀을 변경시키는 코드는 EDT에서 호출해야하므로 별도의 스레드에서 호출하면 안됩니다. 따라서 (웹 서비스 호출 또는 비싼 계산과 같은) 실행하는 데 시간이 걸릴 수있는 것이 있으면 EDT에서 별도의 스레드를 실행하고 EDT에서 코드 실행을 완료하면 UI 업데이트를 수행 할 수 있습니다 . 이를 쉽게하기 위해 SwingWorker과 같은 라이브러리가 있습니다. 대화 상자를 표시하도록 설정하는 경우 별도의 스레드가 아니어야하지만 이러한 데이터 구조를 작성하는 데 시간이 많이 걸리는 경우 별도의 스레드에 데이터 구조를 작성하는 것이 좋습니다.

Swing Worker를 사용하면 Filthy Rich Clients에서 UI의 반응을 더 좋게 만드는 데 유용한 아이디어 중 하나입니다. 이 책의 아이디어를 사용하여 리소스 집약적 인 UI를 꽤 많이 가져 와서 UI가 리소스를 거의 사용하지 않도록 만들었습니다.

+2

동의 함. @Arnon : 나는 당신이 프로그램을보다 효율적으로 만들겠다고 제안하는 것과 같이 두 개의 개별 프로그램을 실행하는 것에 대해 어떻게 생각하는지 듣는 것에 매우 흥미가있을 것입니다. – oltman

+0

감사합니다. 내 프로그램이 불결한 리치 클라이언트 응용 프로그램입니다. http://filthyrichclients.org/ 사용중인 많은 시스템 리소스를 의미합니다. 내 인식은 응용 프로그램이 빠르게로드되어 가능한 한 빨리 사용자 작업에 응답해야한다는 것입니다. 환경 설정 창이 항상 사용되는 것은 아니기 때문에 프로그램을 시작할 때로드 할 이유를 찾지 못했지만 필요할 때 바로로드 할 이유가 없습니다. 그런 이유로 나는 그들을 서로 분리하고 싶다. – Arnon

1

아마도 this과 같은 일종의 디렉토리 감시자를 사용할 수도 있고 일종의 세마포를 구현할 수도 있습니다. 솔직히 사용자가 액세스 할 수있는 메뉴 항목이 있으면 문제를 해결할 수 있어야한다고 생각합니다. 일단 사용자가 환경 설정을 저장하면, 이들은 파일에 기록됩니다. 응용 프로그램은 필요할 때마다 파일에서 값을로드합니다. 시스템이 느리게 작동하거나 매달려있는 경우 스레드 사용을 고려하거나 스레드 수를 늘릴 수 있습니다.

+0

"변화를위한 디렉토리보기"에 링크 된 위대한 링크! 나는 이것이 가능하다는 것을 몰랐다! 나는 이것이이 질문에 대한 최선의 해결책이라고 생각한다. – Jonas

+1

나는 C#에서 이와 비슷한 것이 있다는 것을 알았다. Java와 C#의 가장 큰 장점은 비슷한 일을하는 API의 상당한 양이 있다는 것입니다. D – npinti

+1

자바 7입니다. 타겟 플랫폼에서 사용할 수있게되기까지 2 ~ 3 년이 걸릴 것입니다 ... –

0

실제로 다른 사람들이 설명한 것처럼 프로세스 간 통신을 위해 socket을 사용할 수 있습니다. 그러나 전체 CPU/RAM 사용량을 전혀 줄이지는 못합니다. (리소스 사용을 약간 악화시킬 수도 있음)

경우에 따라 다른 프로세스가 아닌 다른 스레드에서 참조 창을 시작할 수 있습니다. 스레드는 OS가 처리하기에 더 가볍고 프로세스 간 통신에는 추가적인 복잡성이 없습니다.

+0

스윙은 단일 스레드입니다. 픽셀을 변경시키는 모든 코드는 스윙 스레드 또는 EDT에서 호출해야합니다. 하나의 스레드에서 기본 UI를 실행하고 다른 스레드에서 기본 설정 UI를 실행할 수 없습니다. 시도하면 이상한 일이 일어날 수 있습니다. 내 대답을 보라. –

+0

그 곳은 SwingWorker가 들어오는 곳입니다 (UR에서 말한 것처럼). 분명히 포스터의 문제는 UI를 업데이트하는 것이 아니라 UI가 주도하는 작업에서 오는 문제입니다. 일반적으로 Swing의 버퍼 전략은 중복 칠을 피하는 데 효과적입니다. 그래서 지나치게 복잡한 애님 루프를 수행하지 않는다면, GUI 성능은 잘되어야합니다. – Defd

0

Linux 시스템에서 개발자가 사용할 수있는 DBUS는 언급하지 않은 것 같습니다. Windows/Cross Platform 응용 프로그램을 만들려고하는 경우에는 좋지 않겠지 만 DBUS는 기성품 응용 프로그램 통신 플랫폼입니다. 다음과 같은 문제를 해결하는 데 도움이됩니다.

  • 다른 사용자가 이미 시도하고있는 포트를 사용하고있을 수 있습니다. 클라이언트 응용 프로그램 ("환경 설정"창)에서 포트를 수신하는 것이 기본 응용 프로그램인지, 아니면 실제로 발생하는 다른 응용 프로그램인지 여부를 알 수있는 방법이 없습니다. 따라서 어떤 종류의 작업을 수행해야합니다. 핸드 셰이크 및 구현 충돌 해결 메커니즘
  • 미래의 당신이나 당신이 당신이있는 항구에있는 이유를 애플 리케이션을 유지하기 위해 오는 사람에게는 분명하지 않을 것입니다. 이것은 중요하지 않겠지 만 Socket 5574에서의 통신은 org.yourorganisation.someapp 채널에서 통신하는 것만 큼 나만큼 훌륭하게 보이지 않습니다.
  • 방화벽 할 수있다 (나는 이미 말했다하는 사람이 생각하는) 약간의 오버 열심

또한, DBUS에에 손을 점점 가치 -는 등 같은 다른 응용 프로그램의 전체 무리와 통신 유용 당신이 읽을 수


는 최근 우분투 배포판 또는 특정 인스턴트 메시징 클라이언트에서 찾을 수 있습니다 작은 팝업 알림 것 등 내가 아마 얘기 (그리고있어 몇 가지에 정정 해줘 I 've 말했다) 여기 : http://www.freedesktop.org/wiki/Software/dbus. 그것은 그들이 윈도우에서 일어나는 것을 만들기 위해 노력하고있는 것처럼 보입니다.

관련 문제