I'm trying to understand what this statement means:
Each Java Virtual Machine thread has its own pc (program counter)
register. At any point, each Java Virtual Machine thread is executing
the code of a single method, namely the current method (§2.6) for that
assume that the JVM works like any other thread
The JVM is not a thread: It is a process that has many threads.
...so from the CPU's perspective there's only a single program counter
The program counter is just one of several registers that constitute the context of a thread. Each CPU has one set of physical registers (or two sets, if it's hyperthreaded, but let's keep things simple and ignore hyperthreading.) Each CPU can therefore run exactly ONE thread at any given instant time. But...
The operating system can "switch contexts": It can save all of the registers for one thread running on a given CPU, and then load the registers with the saved registers (including the program counter) from some other thread.
In a typical desktop operating system, the operating system scheduler is invoked, maybe 100 times per second or more, to decide which threads should be running at that moment. It will switch out threads that were actually running at that moment, and switch in threads that have been waiting to run.
That way, your computer can have many more live threads than it has CPUs.