Can a kernel be switched like a thread in OS?

When a kernel in a stream is launched, is it possible to stop this kernel and schedule another kernel to run?
If not, when a kernel (most of its threads) is waiting something to be done, then cuda cores will not be available until this kernel is finished?

No, not at the level of the kernel launch. If there is enough resources to support that kernel and another one, then the other kernel can be launched concurrently (from the same application/process), and may execute.

correct, unless there is another concurrent kernel as I mentioned. (In my view, it’s not really that the cuda cores are “not available”, it is that there is nothing for them to do. )

If you have another application/process, it is possible for the GPU to get used for that process, through a mechanism called context switching. This is potentially a way to mitigate the situation even if there are not enough resources for a second kernel.