private static Thread t1;
private static Thread t2;
private static Thread t3;
private static Thread t4;
private static ReentrantLock lock = new ReentrantLock();
public static void main(String[] args) throws InterruptedException {
//线程从创建到消亡,要经历创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、等待(waiting)、消亡(TERMINATED)等若干状态,
// 其中运行、阻塞、等待状态,之间会互相转换
Thread m = Thread.currentThread();
t1 = new Thread(()->{
System.out.println("主线程状态:"+m.getState().name()); // WAITING
System.out.println("t1线程状态2:"+Thread.currentThread().getState().name());
sigletonInstance();
});
t2 = new Thread(()->{
sigletonInstance();
});
t2.start();
t3 = new Thread(()->{
lockTest();
});
t3.start();
t4 = new Thread(()->{
lockTest();
});
t4.start();
t1.setName("t1");
System.out.println("t1线程状态0:"+t1.getState().name()); // NEW
//t1.run();
t1.start();
// run 和 start的区别
// run方法执行,直接调用runable的run方法,不会创建现在,在当前的主线程中执行
// start方法执行,会创建一个新的线程(映射操作系统的线程),默认名称为Thread-0,然后调用run()方法,线程的状态为RUNNABLE
System.out.println("t1线程状态1:"+t1.getState().name()); // RUNNABLE
t1.join(); // 阻塞主线程,等子线程执行完成,主线程恢复执行
System.out.println("t1线程状态3:"+t1.getState().name()); // TERMINATED销毁
}
// 锁测试,第一个线程获得锁之后,后面的线程指定进入waiting状态,等第一个线程执行完成释放锁之后,后面线程方可执行
private static void lockTest() {
lock.lock();
try {
Thread.sleep(100l);
System.out.println("t3:"+t3.getState().name()+" t4:"+t4.getState().name());
// t3:RUNNABLE t4:WAITING
Thread.sleep(100l);
}catch (Exception e){
e.printStackTrace();
}
lock.unlock();
}
// 阻塞代码块,第一个线程进入该方法之后,后面的线程进入阻塞状态
private synchronized static void sigletonInstance(){
try {
Thread.sleep(100l);
System.out.println("t2:"+t2.getState().name()+" t1:"+t1.getState().name());
// t2:RUNNABLE t1:BLOCKED
Thread.sleep(100l);
} catch (InterruptedException e) {
e.printStackTrace();
}
}