A priori I do not believe the claim made here: a GPars task is submitted to a thread pool, which is exactly what the goroutines are. Thus the number of Java threads is not a bound on the number of GPars tasks. Any
bounds will be provided by the Fork/Join pool.

Here is a GPars sample from http://www.gpars.org/1.0.0/guide/guide/GroovyCSP.html

final class Copy implements Callable {
    private final DataflowChannel inChannel
    private final DataflowChannel outChannel1
    private final DataflowChannel outChannel2

public def call() {
        final PGroup group = Dataflow.retrieveCurrentDFPGroup()
        while (true) {
                def i = inChannel.val
                group.task {
                        outChannel1 << i
                        outChannel2 << i
                }.join()
        }
}

If inChannel.val blocks, the thread serving the Copy instance is blocked and lost for serving other channels. If this happens several times the JVM has run out of threads and the application is in limbo.

This is not the case in Go. When a goroutine is blocked by a blocking take on an empty channel, the Go scheduler withdraws the thread serving this goroutine and assigns it to some other goroutine.

Reply via email to