1. Thread priorities
1. Every thread in java has some priority, it may be default priority or custom priority.
2. Thread priority range is 1 to 10.(Min priority = 1, Max priority = 10)
3. Thread class contains constant values
a. Thread.MIN_PRIORITY = 1
b. Thread.NORM_PRIORITY = 5
c. Thread.MAX_PRIORITY = 10
4. Thread Scheduler will use priorities while allocating processor.
5. The thread which is having highest priority will get the chance first to execute.
6. If two threads having same priority then we can’t expect exact execution order, it depends on Thread Scheduler.
7. Thread.setPriority(int); for setting priority to thread. Allowed values range is 1 to 10, other than this range, it will throw IlligalArgumentException.
2. How thread priorities will work
1. The default priority only for main thread is 5, but all remaining thread default priority inherited from parent to child.
2. Whatever priority parent thread has, the same priority will be there for child thread by default.
3. Some OS /Platforms won’t provide support for thread priorities.
4. After thread created and in middle of execution also we can change the thread priority.
public class MyThread implements Runnable {
public void run() {
System.out.println("HI”);
}
public static void main(String[] args) {
MyThread runnable = new MyThread();
Thread.currentThread().setPriority(7);
Thread thread = new Thread(runnable);
thread.start();
System.out.println(thread.getPriority());//7
}
}
3. How many ways to stop the execution of thread temporarily
1. Following Thread class methods are stop the execution of a thread temporarily.
a. yield()
b. join()
c. sleep()
4. Thread class yield() usage
1. yield() causes to pause current executing thread to give the chance for waiting threads of same priority or high priority.
2. If there is no waiting thread or all waiting threads have low priority then same thread can continue its execution.
3. If multiple threads are waiting with same priority then which waiting thread will get the chance we can’t expect it depends on thread scheduler.
4. The thread which is yielded, when it will get chance once again it depends on Thread scheduler.
5. Syntax of yield()
public static native void yield();
6. Once Thread.yield() is called , then thread will go to Runnable state.
7. A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore this hint.
public class MyThread implements Runnable {
public void run() {
for(int i=0; i<10; i++){
System.out.println(“child thread”);
Thread.yield();
}
}
public static void main(String[] args) {
MyThread runnable = new MyThread();
Thread thread = new Thread(runnable);
thread.start();
for(int i=0; i<10; i++){
System.out.println(“main thread”);
}}}
7. In the above program if we are commenting Thread.yield() , than both the threads will be executed simultaneously and we can’t expecting which thread will complete first.
8. If we are not commenting Thread.yield() than child thread always calls yield() because of that main thread will get chance more number of times and the chance of completing main thread first is high.
9. Yield() is native method , so its not implemented in java, it needs support from underlying OS.
10. Some platforms won’t provide proper support for yield().So we can’t expect it always pauses the current thread.
11. If we call yield() than current thread will stop its execution and it will go to ready state(if and only if same or high priority thread is exists).
4. Can we yield() particular thread by calling yield() using thread object instead of Thread class
- No, we can’t call yield() of a particular thread, but we can call yield() using any thread object.
- There is no difference between below 3 statements will yield the currently executing thread only.
- Thread.yield() → Currently executing thread will be yielded.
- t1.yield() → Currently executing thread will be yielded, not t1 thread.
- t2.yield() → Currently executing thread will be yielded, not t2 thread.