how does pipe data chunking work?

Have to admit I'm not clear on this one.. when piping programs together on a
terminal, what determines how often the output of the first program is sent
to the second program? And what amount of data?

It seems that with a command like:
find . -iname \*bz2 -print0 | xargs -0 bunzip2

...find will execute in entirety, then pass on its output all at once..? I
tested this with a double zipped file. Like some_file.bz2.bz2. It gets
decompressed only once, resulting in some_file.bz2.

Yet a command like:
dd ... | gzip ...

...will send blocks at a time, and both programs work simultaneously.

Matthew 7:7