高并发和多线程(2)——Sleep Yield Join
工作中用好多线程是你编码的一大亮点,手敲下Thread类下面的 Sleep Yield Join 更好的理解下这几个方法:
Sleep
让当前正在执行的线程先暂停一定的时间,并进入阻塞状态。在其睡眠的这段时间内,该线程由于不是处于就绪状态,因此不会得到任何执行的机会。
因此即使系统中没有任何其他可执行的线程,处于sleep中的线程也不会执行。因此sleep方法经常用来暂停线程的执行,当sleep到时间后,该线程转入就绪状态,这样才能够继续执行
static void testSleep() {
new Thread(()->{
for(int i=0; i<100; i++) {
System.out.println("A" + i);
try {
Thread.sleep(500);
//TimeUnit.Milliseconds.sleep(500)
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
Join
join方法时让一个线程等待另一个线程执行完才能继续执行,如果线程B执行中调用了线程A的join方法,则线程B将会阻塞,知道线程A执行完为止,B才能继续执行
static void testJoin() {
Thread tA = new Thread(()->{
for(int i=0; i<10; i++) {
System.out.println("A" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread tB = new Thread(()->{
try {
tA.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
for(int i=0; i<10; i++) {
System.out.println("B" + i);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
tA.start();
tB.start();
}
Yield
线程让步 不会释放锁。让一个线程执行yield方法后,就会进入就绪状态,让出时间片让其他线程执行,sleep和join是进入阻塞状态。而且yield方法还与线程优先级有关,当某个线程调用yield方法时
就会从运行状态转换到就绪状态,CPU从就绪线程队列选择一个优先级更高或者相同优先级的线程去执行。这也就意味着如果多线程的优先级是一样的,该线程调用yield方法后,也会再一次获得cpu继续去执行
static void testYield() {
new Thread(()->{
for(int i=0; i<100; i++) {
System.out.println("A" + i);
if(i%10 == 0) Thread.yield();
}
}).start();
new Thread(()->{
for(int i=0; i<100; i++) {
System.out.println("------------B" + i);
if(i%10 == 0) Thread.yield();
}
}).start();
}
工作中可能用到的不多,纯粹是为了再次理解基本方法学习下,哈哈!