J'expérimente la tâche suivante pour obtenir ma tête autour RxJava:rxjava2 - simple exemple d'exécuter des tâches sur un pool de threads, inscrivez-vous sur un seul thread
- Étant donné une liste d'URL
- Do une requête HTTP pour chaque URL sur un pool de threads
- pour chaque résultat insérer des données dans une base de données SQLite (pas multithreading ici)
- Bloquer la méthode jusqu'à ce qu'il termine
Alors je l'ai essayé dans Kotlin:
val ex = Executors.newFixedThreadPool(10)
Observable.fromIterable((1..100).toList())
.observeOn(Schedulers.from(ex))
.map { Thread.currentThread().name }
.subscribe { println(it + " " + Thread.currentThread().name }
Je m'y attendais à imprimer
pool-1-thread-1 main
pool-1-thread-2 main
pool-1-thread-3 main
pool-1-thread-4 main
....
Cependant, il imprime:
pool-1-thread-1 pool-1-thread-1
pool-1-thread-1 pool-1-thread-1
pool-1-thread-1 pool-1-thread-1
Quelqu'un peut-il corriger mes malentendus sur la façon dont cela fonctionne? Pourquoi n'utilise-t-il pas tous les threads du pool de threads? Comment puis-je faire en sorte que mon abonné s'exécute sur le thread principal ou le bloc jusqu'à la fin?