To read its input, xargs uses the read function (see also the corresponding Linux manpage).
read reads the next available data from a file descriptor into an area of memory specified by the calling program. As used by xargs, read waits until either data is available, or an error occurs, or it determines that no more data will ever be available. It returns respectively a positive integer, -1, or 0 in each of these cases.
To determine when it’s finished reading its input (its standard input, or the input specified by the -a option), xargs looks for the specified end-of-file marker (if the -E option was used), or a 0 return value from read.
You can see this in action by running
printf '%s ' {1..1024} | strace -e read xargs -s 2048 -x