RxJava - 为什么执行程序只使用一个线程

时间:2015-12-30 05:50:43

标签: java multithreading rx-java reactivex rx-javafx

我创建了一个固定的线程池来处理每300毫秒的事件发射,并假设该过程需要1000毫秒。假设多线程可以工作但只重用一个线程。

如果我将sleepTime设置为小于300毫秒,则处理线程会改变,但这是无用的。

问题:如何让它并发?为什么程序重用该线程?

提前谢谢

html, body, #canvas {
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
}

日志

<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r73/three.min.js"></script>
<canvas id="canvas"></canvas>
<script id="vertex-shader" type="x-shader/x-vertex">
  varying vec2 vUv;

  void main() {
    vUv = uv;
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
  }
</script>
<script id="fragment-shader" type="x-shader/x-fragment">
  #define M_TAU 6.2831853071795864769252867665590

  varying vec2 vUv;

  void main() {
    float w = sin(500.0 * M_TAU * vUv.x) / 2.0 + 0.5;
    vec3 color = vec3(w, 0.0, 0.0);
    gl_FragColor = vec4(color, 1.0);
  }
</script>

3 个答案:

答案 0 :(得分:0)

根据我在您的代码中所理解的,生产者的生产速度比订阅者更快。但是Observable<Long> interval(long interval, TimeUnit unit)实际上不支持Backpressure。文档说明了

  

此操作员因使用时间而不支持背压。如果   下游需要更慢,它应该减慢计时器或使用一些东西   比如{@link #onBackpressureDrop}。

如果您的处理速度真的比生产者慢,那么您在订阅者代码中可以做的就是这样

.subscribe(new Action1<Long>() {

    @Override
    public void call(Long pT) {
        e.submit(new Runnable() {
            System.out.println("i am " + pT + "in thread:" + Thread.currentThread().getName());

        }
    }
});

答案 1 :(得分:0)

相反

 .subscribeOn(Schedulers.computation())

尝试

 .observeOn(Schedulers.computation())

我之前用Rx实现并发性的这个例子非常好用作例子

   public class ObservableZip {

private Scheduler scheduler;
private Scheduler scheduler1;
private Scheduler scheduler2;

@Test
public void testAsyncZip() {
    scheduler = Schedulers.newThread();
    scheduler1 = Schedulers.newThread();
    scheduler2 = Schedulers.newThread();
    long start = System.currentTimeMillis();
    Observable.zip(obAsyncString(), obAsyncString1(), obAsyncString2(), (s, s2, s3) -> s.concat(s2)
                                                                                        .concat(s3))
              .subscribe(result -> showResult("Async:", start, result));
}




public void showResult(String transactionType, long start, String result) {
    System.out.println(result + " " +
                               transactionType + String.valueOf(System.currentTimeMillis() - start));
}


public Observable<String> obAsyncString() {
    return Observable.just("")
                     .observeOn(scheduler)
                     .doOnNext(val -> {
                         System.out.println("Thread " + Thread.currentThread()
                                                              .getName());
                     })
                     .map(val -> "Hello");
}

public Observable<String> obAsyncString1() {
    return Observable.just("")
                     .observeOn(scheduler1)
                     .doOnNext(val -> {
                         System.out.println("Thread " + Thread.currentThread()
                                                              .getName());
                     })
                     .map(val -> " World");
}

public Observable<String> obAsyncString2() {
    return Observable.just("")
                     .observeOn(scheduler2)
                     .doOnNext(val -> {
                         System.out.println("Thread " +  Thread.currentThread()
                                                               .getName());
                     })
                     .map(val -> "!");
  }

 }

答案 2 :(得分:0)

我在GitHub找到了答案!

内部observable确实在多线程上发出,但接下来的做法不是。如果我想要它是并行的,我应该在内部可观察量中进行。