JUCEApplication shutdown() vs systemRequestedQuit()

What is the difference between shutdown() vs systemRequestedQuit()?

Calling JUCEApplication::getInstance()->shutdown() caused juce_win32_Threads.cpp to get stuck in

60	bool WaitableEvent::wait (const int timeOutMs) const noexcept
61	{
62		return WaitForSingleObject (handle, (DWORD) timeOutMs) == WAIT_OBJECT_0;
63	}

until I replaced mainWindow = nullptr by quit() in shutdown()

51 void shutdown() override
52 {
53 	// Add your application's shutdown code here..
54 	// mainWindow = nullptr; // (deletes our window)
55 	quit(); // added to avoid WaitForSingleObject loop
56 }

whereas JUCEApplication::getInstance()->systemRequestedQuit() already had quit() in it and never caused problems.

A look in the doce of systemRequestedQuit() reveals:
This callback is called, whenever someone or something tries to close your app. That can be Cmd+Q or the system going down, closing the main window etc. It is provided to give you the chance to abort shutting down your app or to show a “save or discard” dialog.

The shutdown() instead will be called to clean up anything you created in initialise(). It is provided for symmetry. But also it is beneficial for some things (like e.g. opening audio devices) to do that separate from constructor and destructor, so you can create things asynchronous.

Do you use any thread or similar yourself, that could be responsible for the waiting at shutdown?
I didn’t experience that so far…