In reply to manon:
I’m not sure I can answer your question directly but I can give you some thoughts to consider.
Your two proposals are not mutually exclusive. Either way you need to have a process that gets blocked waiting for something to happen. It’s created by the run_phase of a component, or a fork/join_none in a sequence. An either can be triggered by uvm_event or an analysis port.
If you do a search for “UVM interrupt service routine” you should get pointers to many conference papers and other posts that many contain more ideas.