2012-04-17 2 views
2

나는 동시에 두 개에서 네 개의 스레드가있는 멀티 스레딩 프로그램을 작성했습니다. 스레드 중 하나는 시간이 중요한 스레드이며, 500 밀리 초마다 호출되며 10 밀리 초 이상 지연시키지 않습니다. 그러나 다른 스레드가 더 많은 로딩을 할 때, 나는 약 2 밀리 초가 발생한다는 것을 알았다. (타임 스탬프를 출력하여 보여줍니다.) 그래서 오랜 시간 동안 실행 한 후에는 타임 스탬프를 확인하는 것을 제외하고는 10 밀리 초 이상을 지연시키고 루프 간격을 조정하여 시간이 10 밀리 초 이상 지연되지 않도록해야합니다. , 그것을 안전하게하는 방법이 있습니까?Java에서 스레드가 지연되지 않도록하려면 어떻게해야합니까?

감사합니다.

답변

1

당신은 당신의 스레드 우선 순위를 설정할 수 있습니다

myCriticalThread.setPriority(Thread.MAX_PRIORITY); 
otherThread.setPriority(Thread.NORM_PRIORITY); // the default 
yetAnotherThread.setPriority(Thread.MIN_PRIORITY); 

정말하지만 아무것도 보장하지 않습니다.

4

는 포함 완전한 실시간 시스템을 설정하는 노력을하지 않는 OS가 (다른 프로세스에게 우선 순위를 부여하기로 결정할 수 있기 때문에 당신이 당신의 스레드가 지연되지 보장이 없다 Real-Time Java

+0

의 핵심. 그것은 무거운 WebSphere 무거운 일부입니다. 거기에 좋은 실시간 Java 솔루션이 없다고 생각합니다. –

+0

글쎄, 나는이 링크를 줄 수 있었다 : http://www.rtsj.org/ 그러나 WebSphere 사이트가 개념을 요약하는 좋은 일을했다고 생각했다. (실제로는 JSR [JSR-1]의 참조 구현이다.) 나는 그것으로 일하는 많은 경험이 없기 때문에 두려워, RTSJ가 작동하지 않는 것에 대해 뭔가가 있나? –

+0

내가 아는 한 아직 사양 수준이고 공개 된 연구입니다. IBM의 솔루션은 약간의 소금 가치가 있을지도 모르지만, IBM의 목을 막는 것과 관련이있을 것입니다. –

0

해야 할 것 같은데 수정 된 OS). 말했다되는 것을 기본 작업을 위해, 당신은이 같은 ScheduledExecutorService을 사용해야합니다

class A { 
    private final ScheduledExecutorService exe = Executors.newScheduledThreadPool(1); 

    public void startCriticalAction(Runnable command) { 
    this.exe.scheduleAtFixedRate(command, 100, 100, TimeUnit.MILLISECONDS); 
    } 

    public void shutdown() { 
    this.exe.shutdown(); 
    } 
} 

집행자 서비스는 작업을 100ms마다 실행하기 위해 최선을 다할 것입니다. 많은 일이 잘못 될 수 있기 때문에 직접이 기능을 개발하면 안됩니다.

2

타이밍이 중요한 경우 해당 스레드 전용 코어에서 대기 중 대기를 사용합니다. 그러면 대부분의 경우 시간당 10 마이크로 초의 지터가 발생합니다. < < 조금 극단적인데 논리 스레드가 다른 용도로 사용되지 않게됩니다.

이것은 내가 사용하는 라이브러리입니다. 논리 스레드 또는 전체 핵심을 예약하는 데 사용할 수 있습니다. 리눅스에 grub.conf 파일에서 = isolcpus를 사용하여 https://github.com/peter-lawrey/Java-Thread-Affinity

는 논리 스레드 나 코어 (상대적으로 작고 <이 우리가 지연 100 Hz에서 타이머 및 전원 관리 제외) 다른 사람을 위해 사용되지 않도록 할 수

시간 제한에
0

크리프 최대 :

waitFor(int timeout) 
{ 
    dateTime wallTimeEnd; 
    wallTimeEnd=now()+(msToDateTime(timeout)); 
    int interval=timeout/2; 
    while(true){ 
    if(interval>10){ 
     sleep(interval); 
     interval=dateTimeToMs(wallTimeEnd-now())/2; 
    } 
     else 
     { 
     do{ 
      sleep(0); 
      interval=dateTimeToMs(wallTimeEnd-now()); 
     }while(interval>0); 
    } 
} 

이 단지 폐기물 내가 그 OP 도와 줄게 생각하지 않는다 5-10ms

관련 문제