Actually "threading" dependes on MessageChannel type:
E.g. DirectChannel (<channel id="foo"/> - default config) doesn't do anything with threads and just shifts the message from send to the subscriber to handle it. If the handler is an AbstractReplyProducingMessageHandler it sends its result to the outputChannel and if the last one is DirectChannel, too, the work is done within the same Thread.
Another sample is about your inbound channel adapter. On the background there is a scheduled task, which executes within the Scheduler thread and if your poll is very often the next poll task might be executed within the new Thread.
The last "rule" is acceptable for QueueChannel: their handle work is done with Scheduler thread, too.
ExcecutorChannel just places the handle task to the Executor.
All other info you you can find in the Reference Manual provided by Gary Russell in his answer.