2012-09-08 3 views
1

어떻게 이런 코드를 만들 수 있습니까?Java scheduleAtFixedDelay stop

public void start() 
{ 
    ThreadPoolManager.getInstance().scheduleWithFixedDelay(new Thread(), 1000, 1000); 
} 

public class Thread implements Runnable 
{ 
    int i = 0; 
    @Override 
    public void run() 
    { 
     i++; 
     if(i==5) 
      //TODO stop this thread 
    } 
} 

나는 스레드를 중지 할 후에 내가 == 5

편집 : 그것은 그런 식으로 수행 할 수 있습니다

public void start() 
{ 
    ThreadPoolManager.getInstance().schedule(new Thread(), 1000); 
} 

public class Thread implements Runnable 
{ 
    int i = 0; 
    @Override 
    public void run() 
    { 
     while(i!=5) 
     { 
      i++; 
      try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();} 
     } 
    } 
} 

그러나 사람이 어떻게 그것을 만드는 아이디어가 여전히있는 경우 scheduleWithFixedDelay 나는 대답을 기쁘게 생각합니다 :)

+0

그것은'scheduleWithFixedDelay'하지'scheduleAtFixedDelay'입니다. – Tudor

+0

이 스레드를 중지 한 후에도 계속 풀을 사용 하시겠습니까? – Tudor

+0

동시에 여러 스레드를 사용하고 싶습니다. scheduleAtFixedDelay/scheduleWithFixedDelay에 대해 죄송합니다. 나는 그것이 ScheduledThreadPoolExecutor를 재정의하고 그것을 알아 차리지 못한 클래스에서 변경된 것을 가지고있다. – user1656546

답변

1

자체는 조금 더 복잡하다 내에서 ScheduledThreadPoolExecutor 작업을 중지. 당신은 (스레드로부터 안전하지 않습니다하지만 1000 ms의 지연이 있기 때문에이 충분해야한다) 작업 자체에 ScheduledFuture을 다시 전달하고 cancel를 호출을 시도 할 수 있습니다 :

public void start() 
{ 
    Task t = new Task(); 
    ScheduledFuture sf = ThreadPoolManager.getInstance().scheduleAtFixedDelay(t, 1000, 1000); 
    t.setFuture(sf); 
} 

class Task implements Runnable { 

    private int i = 0; 
    private ScheduledFuture sf; 

    public void setFuture(ScheduledFuture sf) { 
     this.sf = sf; 
    } 

    public void run() { 
     i++; 
     if(i==5) 
      sf.cancel(true); 
    } 
} 
+0

ThreadPoolManager.getInstance(). shutdown(); 모든 스레드가 종료되고이 스레드 만 필요합니다./ – user1656546

+0

@ user1656546 : 내 편집을 참조하십시오. – Tudor

0

그냥 this.stop()을 사용할 수 있습니다.

편집 : 그렇게, FixedDelay-ING 했을까 통지를하지 않았다

public void start() 
{ 
    ThreadPoolManager.getInstance().scheduleAtFixedDelay(new Thread(new MyThread()), 1000, 1000); 
} 

public class MyThread implements Runnable 
{ 
    int i = 0; 
    boolean keepGoing = true; 
    @Override 
    public void run() 
    { 
     if (keepGoing) 
     { 
      i++; 
      System.out.println("Thread in " + i); 
      if(i==5) 
       keepGoing = false; 
     } 
    } 
} 
+0

왜'i'는 정적입니까? – arshajii

+0

@A. R. S. 왜냐하면 우리는 그 프로그램을 위해서 오직 하나만을 원하기 때문입니다. 글쎄, 만약 클래스가 재사용된다면 그게 아니라는 생각이 들지.하지만 그것은 내가 한 일이다. P edit : 그래, 나는 그것을 바꿀 것 같다. P – Doorknob

+0

나는 그 해결책에 대해 생각했지만, 실제로 나의 프로그램은 훨씬 더 복잡하고이 방법은 꽤 자주 실행하고 나는 그것에 미완성 스레드를 보내고 싶지 않아. – user1656546