Java线程实现按序打印
在Java中可以通过使用thread线程的join()方法来阻塞线程,实现多线程情况下的按序执行等逻辑.
public void execB() {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(Thread.currentThread().getName() + ":线程执行");
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
/**
* join方法,底层是wait方法.
*
* t2线程调用t1.join()方法,等价于调用t1.wait()方法
*
* join()方法是被synchronized修饰的,作用于当前this对象锁,也就是t1对象锁,
*
* 本质就是t2线程的锁对象是t1,调用t1.join()方法,使t2线程释放t1对象锁,t2变为阻塞状态.
*
* t2线程进入t1锁对象的阻塞队列中.
*
*/
t1.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":线程执行");
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
/**
* t3线程调用t2.join()方法,等价于调用t2.wait()方法
*
* join()方法是被synchronized修饰的,作用于当前this对象锁,也就是t2对象锁,
*
* 本质就是t3线程的锁对象是t2,调用t2.join()方法,使t3线程释放t2对象锁,t3变为阻塞状态.
*
* t3线程进入t2锁对象的阻塞队列中.
*/
t2.join();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":线程执行");
}
}, "t3");
/**
* t1,t2,t3三个线程同时执行
*
* t2线程执行时,由于调用了t1.join()方法,t2线程阻塞,
* t3线程执行时,由于调用了t2.join()方法,t3线程阻塞,
*
* t1线程执行完成后,在底层jvm虚拟机中t1锁对象调用notifyAll()方法,唤醒t1锁对象阻塞队列中的所有线程,t2线程开始执行.
*
* t2线程执行完成后,在底层jvm虚拟机中t2锁对象调用notifyAll()方法,唤醒t2锁对象阻塞队列中的所有线程,t3线程开始执行.
*
*
*
*
*
*/
t1.start();
t2.start();
t3.start();
}
public static void main(String[] args) {
JoinThread thread = new JoinThread();
//main方法中执行
thread.execB();
}
thread.join()方法本质上就是将当前调用thread.join()方法的线程加入到thread锁对象的阻塞队列中,当thread线程执行完毕后,jvm虚拟机会主动唤醒被阻塞的当前线程.