Check this code out
Thread t1 = new Thread(new Runnable() {
@Override
public void run()
{
try
{
Java threads are user threads for sure but eventually they're mapped to kernel-level threads before getting executed for real. This mapping probably depends on particular JVM implementation (or the mapping model).
Scheduling wise, kernel threads are scheduled at the os level by an alarm clock that interrupts the kernel periodically. IMO, when that happens, your JVM thread(potentially multiple) may get to execute it's code, or may spawn another thread (which could cause the os to create another kernel thread or block it depending on the mapping model), or may run it's own particular scheduling algorithm to decide which thread which were previously blocked on the same lock will be context-switched next etc.