1 - Yes, you can. As described here you can use:
sendAll(payload: Any, sessions: Set<FlowSession>)
: it sends the payload object to all the provided FlowSession. It would be associated with receiveAll(receiveType: Class<R>, sessions: List<FlowSession>): List<UntrustworthyData<R>>
sendAllMap(payloadsPerSession: Map<FlowSession, Any>)
: it sends a potentially different payload to each FlowSession, as specified by the provided payloadsPerSession. It would be associated with receiveAllMap(sessions: Map<FlowSession, Class<out Any>>): Map<FlowSession, UntrustworthyData<Any>>
2 - Flows have to be created for each party:
FlowSession session1 = initiateFlow(counterparty1);
FlowSession session2 = initiateFlow(counterparty2);
but then you can pass all of them to the same
sendAll(payload, listOf(session1, session2))
3 - You have to use CollectSignaturesFlow(initiallySignedTx, listOf(sessions))
, which receives in input a list of sessions. You can take a look to its implementation here and its unit tests here, or an example of usage here.