비 Gui Java 앱의 적절한 배경 프로세스 동작은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/440417

  •  22-07-2019
  •  | 
  •  

문제

Java Command Line 응용 프로그램이 자원을 호그하지 않고 배경 작업을 수행하는 올바른 방법은 무엇입니까? 루프에서 수면 ()을 사용해야합니까? 아니면 더 우아하고 효율적인 방법이 있습니까?

도움이 되었습니까?

해결책

일부 휴리스틱 :

  • 응용 프로그램에서 일정 결정을 내려고 시도하지 마십시오. 운영 체제의 스케줄러는 당신보다 훨씬 낫습니다. 일을하게하십시오.
  • 필요하지 않으면 투표하지 마십시오. 예를 들어, 잠을 자지 않고 N 몇 초 동안 깨어나서 차단되지 않은 소켓을 확인하고 소켓의 블록을 차단하십시오. 이 두 번째 전략은 운영 체제의 스케줄러에서 더 잘 작동합니다.
  • 필요하지 않은 경우 거대한 힙을 사용하지 말고 한 번에 막대한 기억 덩어리를 할당하지 마십시오. 스 래싱 응용 프로그램은 시스템 성능에 부정적인 영향을 미치는 경향이 있습니다.
  • 버퍼링 된 I/O를 사용하십시오. 언제나. 더 부러지는 I/O가 필요하다고 생각되면, 당신이 옳다고 확신하십시오. (아마도 틀렸을 것입니다.)
  • 많은 스레드를 생성하지 마십시오. 실은 놀랍게도 비싸다. 특정 시점 외에도 더 많은 스레드가 있습니다 줄이다 응용 프로그램의 성능 프로필. 동시에 할 일이 많으면 배우고 사용하십시오. java.util.concurrent.

물론 이것은 단지 스타터 목록 일뿐입니다 ...

다른 팁

해야 할 일이없는 경우 수면 () 만 사용할 것입니다. 예를 들어, 작업 대기열을 주기적으로 폴링하는 것과 같은 일을하고 있고 거기에 아무것도 없다면 잠시 잠을 자고 다시 확인하십시오.

CPU를 호그하지 않도록하려고하지만 여전히 실제 작업을 수행하고 있다면 주기적으로 Thread.yield ()를 호출 할 수 있습니다. 그것은 CPU의 제어를 포기하고 다른 스레드를 실행하게하지만, 잠을 자지는 않을 것입니다. 다른 프로세스에 CPU가 필요하지 않으면 제어를 되돌리고 작업을 계속합니다.

또한 스레드를 최우선 순위로 설정할 수도 있습니다 : Mythread.setPriority (thread.min_priority);

Ishmael이 말했듯이, 메인 스레드에서는 이것을하지 마십시오. 대신 "작업자 스레드"를 만듭니다. 그렇게하면 UI (GUI 또는 CLI)는 여전히 반응이 좋습니다.

여러 가지 방법이 있습니다. ExecutorService를 사용합니다 ... 예를 들어 :

ExecutorService service = Executors.newCachedThreadPool();

Callable<Result> task = new Callable<Result>() {
    public Result call() throws Exception {
        // code which will be run on background thread
    }
};

Future<Result> future = service.submit(task);

// Next line wait until background task is complete
// without killing CPU. Of course, you can do something
// different here and check your 'future' later.
//
// Note also that future.get() may throw various exceptions too,
// you'll need to handle them properly

Result resultFromBackgroundThread = future.get();

이것은 Java 5 코드, ExecutorService, Callable, Future 및 유사한 것입니다. java.util.concurrent 패키지.

시작해야 할 곳 중 하나는 해당 자원 만 사용되고 다른 물체 만 사용되지 않도록하는 것입니다 (따라서 쓰레기가 수집되는 것).

단일 스레딩 애플리케이션에 Sleep ()를 배치하면 현재 스레드가 중단됩니다. 배경에서 처리되는 데이터를 달성하려고하는 경우 정보를 여전히 사용자에게 제시 해야하는 경우 배경 프로세스를 분리 된 스레드에 넣는 것이 가장 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top