Actually, a thread is an abstract concept. It is just an atomic process which should be executed. By atomic, I mean a process which, if you stop it (e.g. because it is too long and you want to execute another one) you need to store its current state and restore it before to continue the execution of the process. Now, what is in the process depends on what you want it to be. In C for instance, a language which were designed to build OSs if I remember well, a process is basically a program. This program can ask to the system to run other programs, or to fork itself to run a clone (by using the fork() function). Whether it is a different program or a clone, it is anyway a different process, which should be executed atomically. In C, a thread is a program. In Java, a thread is a class extending Thread. In C, you start a thread/program by executing its main() function, in Java you run a thread/class by executing its run() method. That is for the thread concept alone. It is just a generic name for the program or the Thread instance which is executed.
Nowaday, computers need to execute many stuff in parallel. It leads to manage several threads at the same time. Here comes the thread pool: it is a list of threads to execute. Nothing more. A simple list. But with that, you have the scheduler: you have a given number of "processors", and you need to decide which threads to execute on them, but you cannot execute more threads than you have "processors". The scheduler strategy should be designed to save as much time as possible, and this depends on the content and the dependencies of the threads. Different strategies can be used, like a balanced execution time, round robin, priorities, etc.
I put "processors" in quotes because I mean here "computing units". It can be the physical processor of the computer, or CPU, which nowaday has between 2 and 8 cores usually (meaning it can run 2-8 threads at the same time), and execute CPU instructions (typically RISC). It can be the processors of the graphic card, or GPU, which has several dozens or hundreds of cores, but use a different set of instructions. Iit can also be the processor from the Java Virtual Machine or JVM, which can run a single thread only and use its own set of instructions (bytecode). The main difference between the JVM and the two previous ones is that the CPU and GPU interact directly with the hardware, without intermediaries, while the JVM translate its own bytecode into RISC instructions and ask to the CPU to execute them.
The CPU uses its own scheduler to execute its threads (bloc of RISC instructions, not only one). Let call it a "system thread". But when you program in Java, your execution environment is not the system, it is the JVM, which provides you an abstraction of the system (this is how you can run a Java program on any machine without caring about the system underneath). This means that you are not allowed to communicate with the system directly, so Java provides you a way to deal with threads at its own level, allowing you to create the threads (new Thread()) and provide them to a scheduler (SwingUtilities, Executors, etc.). How your Java threads are translated into system threads, and how your Java scheduler is used to replace the system scheduler, is the job of the JVM.
So when you speak about a thread in Java, you don't speak about a thread at the system level. This is the JVM which will interact with the system in order for you to have a similar behaviour. But your Java thread are not managed by the CPU, thus your ability to ask for a specific scheduling strategy, independently of the scheduling strategy of the CPU.
How is Thread scheduling in Java done?. Available from: https://www.researchgate.net/post/How_is_Thread_scheduling_in_Java_done [accessed May 22, 2017].