线程的强制执行

所谓的线程的强制执行指的是当满足于某些条件之后,某一个线程对象将可以一直独占资源一直到该线程的程序执行结束。

范例:观察一个没有强制执行的线程

 

package multithreading;

public class Enforce {
	public static void main(String[] args) {
		Thread thread = new Thread(()->{
			for (int i = 0; i < 20; i++) {
				System.out.println(Thread.currentThread().getName()+ "执行、i = "+i);
			}
		},"线程对象");
		thread.start();
		for(int x = 0;x < 20;x++) {
			System.out.println("【霸道的main线程】 x =" + x);
		}
	}
}

【霸道的main线程】 x =0
线程对象执行、i = 0
线程对象执行、i = 1
线程对象执行、i = 2
【霸道的main线程】 x =1
线程对象执行、i = 3
【霸道的main线程】 x =2
线程对象执行、i = 4
【霸道的main线程】 x =3
【霸道的main线程】 x =4
【霸道的main线程】 x =5
【霸道的main线程】 x =6
【霸道的main线程】 x =7
【霸道的main线程】 x =8
【霸道的main线程】 x =9
【霸道的main线程】 x =10
【霸道的main线程】 x =11
【霸道的main线程】 x =12
【霸道的main线程】 x =13
【霸道的main线程】 x =14
【霸道的main线程】 x =15
【霸道的main线程】 x =16
【霸道的main线程】 x =17
【霸道的main线程】 x =18
【霸道的main线程】 x =19
线程对象执行、i = 5
线程对象执行、i = 6
线程对象执行、i = 7
线程对象执行、i = 8
线程对象执行、i = 9
线程对象执行、i = 10
线程对象执行、i = 11
线程对象执行、i = 12
线程对象执行、i = 13
线程对象执行、i = 14
线程对象执行、i = 15
线程对象执行、i = 16
线程对象执行、i = 17
线程对象执行、i = 18
线程对象执行、i = 19

这个时候可以发现主线程和子线程都在交替执行,如果现在希望主线程独占执行,那么就可以利用Thread类中的强制执行:

public final vodi join() throws InterruptedException;
package multithreading;

public class Enforce {
	public static void main(String[] args) {
		Thread mainThread = Thread.currentThread();//获取主线程
		Thread thread = new Thread(()->{
			for (int i = 0; i < 20; i++) {
				if(i == 3) {	//如果i=3的时候,后续main线程先执行,执行完再继续执行i循环
					try {
						mainThread.join();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
				System.out.println(Thread.currentThread().getName()+ "执行、i = "+i);
			}
		},"线程对象");
		thread.start();
		for(int x = 0;x < 20;x++) {
				System.out.println("【main线程】 x =" + x);	
		}
	}
}

【main线程】 x =2
【main线程】 x =3
线程对象执行、i = 0
【main线程】 x =4
线程对象执行、i = 1
【main线程】 x =5
线程对象执行、i = 2
【main线程】 x =6
【main线程】 x =7
【main线程】 x =8
【main线程】 x =9
【main线程】 x =10
【main线程】 x =11
【main线程】 x =12
【main线程】 x =13
【main线程】 x =14
【main线程】 x =15
【main线程】 x =16
【main线程】 x =17
【main线程】 x =18
【main线程】 x =19
线程对象执行、i = 3
线程对象执行、i = 4
线程对象执行、i = 5
线程对象执行、i = 6
线程对象执行、i = 7
线程对象执行、i = 8
线程对象执行、i = 9
线程对象执行、i = 10
线程对象执行、i = 11
线程对象执行、i = 12
线程对象执行、i = 13
线程对象执行、i = 14
线程对象执行、i = 15
线程对象执行、i = 16
线程对象执行、i = 17
线程对象执行、i = 18

在进行线程强制执行的时候一定要获取强制执行线程对象之后才可以执行join()调用。