2017-02-03 5 views
0

長期のタスクを中断するにはどうすればよいですか?公開されたフローを中断する方法

public Flowable<Integer> simple(int number) { 
    Flowable<Integer> flowable = Flowable.create(emitter -> { 
     for (int i = 1; i <= number; ++i) { 
      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
       throw e; 
      } 
      emitter.onNext(i); 
     } 
     emitter.onComplete(); 
    }, BackpressureStrategy.BUFFER); 
    flowable = flowable.subscribeOn(Schedulers.newThread()); 
    return flowable.publish().autoConnect(); 
} 

flowableが公開されたときにdisposeメソッドを呼び出した後も、タスクは続行されます。だから私は中断された例外をキャッチしたい。

Flowable<Integer> f = simple(100); 
Disposable d = f.subscribe(number -> System.out.println(number)); 
Thread.sleep(500); 
d.dispose(); 

また、リプレイと同じ動作です。

答えて

1

実行中のスレッドを保存し、ディスポーザブルを登録してスレッドを中断します。

Flowable<Integer> flowable = Flowable.create(emitter -> { 
    Thread myThread = Thread.currentThread(); 
    emitter.setCancellable(() -> myThread.interrupt()); 

    for (int i = 1; i <= number; ++i) { 
     if (Thread.interrupted()) { 
      // Handle interrupt happening while Thread.sleep 
      // was not executing here. 
     } 
     try { 
      Thread.sleep(100); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
      throw e; 
     } 
     emitter.onNext(i); 
    } 
    emitter.onComplete(); 
}, BackpressureStrategy.BUFFER); 
+0

スリープが長すぎる(Thread.sleep(1000000);)か、IO操作がブロックされていると機能しますか? –

+0

理論的には、 'Thread.interrupt()'にリストされている操作と同じくらい長く動作するはずです。 – Kiskae

関連する問題