Most snaps won’t do any work until they receive a document to process. So, for cases where you need to execute things in order, you need to control the flow of the documents. In this case, you would have one PipelineExecute for X1 that was connected to the PipelineExecute for X2. When X1 finishes, the PipeExec snap will write a document to its output view and that will cause the downstream PipeExec to start X2. (Note that X1 should not have any unlinked output views since the documents that flow out of there will come out of the PipeExec output view.)
Alternatively, if you wanted to put all the snaps in the same pipeline, you can do like @aleung suggested and use an Aggregate or Tail snap to control the flow. These snaps won’t output a document until their upstream snaps have finished. So, that will ensure the ordering.