1)Thread.sleep()/sleep(long millis)
当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,因为sleep(millis)休眠到达后,无法保证会被JVM立即调度);sleep()是一个静态方法(static method) ,所以他不会停止其他的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。 作用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留一定的时间给其他线程执行的机会;
2)Thread.yield()
让出CPU的使用权,给其他线程执行机会、让同等优先权的线程运行,如果没有同等优先权的线程,那么yield()方法将不会起作用。
3)thread.join()
相当于把要调用join方法的线程也嵌套在当前的运行环境中,当前运行环境处于阻塞状态,直到调用join方法的线程执行完之后再继续往下执行!!
例子:
/**
* @编写人: yh.zeng
* @编写时间:2017-1-18 下午5:01:06
* @文件描述: todo
*/
class ThreadRunnable implements Runnable{
private static int CIRCLE = 100;
@Override
public void run() {
System.out.println("进行线程:" + Thread.currentThread().getName());
while(CIRCLE >= 0){
System.out.println("线程" + Thread.currentThread().getName() + "正在打印信息CIRCLE=" + CIRCLE);
CIRCLE --;
}
System.out.println("退出线程:" + Thread.currentThread().getName());
}
}
public class ThreadJoinTest {
public static void main(String args[]) throws InterruptedException{
System.out.println("进入主线程" + Thread.currentThread().getName());
Thread thread1 = new Thread(new ThreadRunnable());
thread1.start();
thread1.join();
System.out.println("退出主线程" + Thread.currentThread().getName());
}
}
主线程main 在执行了thread1.join(); 代码之后,就一直处于阻塞状态,直到线程thread1执行完毕之后,才继续执行下一行代码!!
执行效果:
进入主线程main
进行线程:Thread-0
线程Thread-0正在打印信息CIRCLE=100
线程Thread-0正在打印信息CIRCLE=99
线程Thread-0正在打印信息CIRCLE=98
线程Thread-0正在打印信息CIRCLE=97
线程Thread-0正在打印信息CIRCLE=96
线程Thread-0正在打印信息CIRCLE=95
线程Thread-0正在打印信息CIRCLE=94
线程Thread-0正在打印信息CIRCLE=93
线程Thread-0正在打印信息CIRCLE=92
线程Thread-0正在打印信息CIRCLE=91
线程Thread-0正在打印信息CIRCLE=90
线程Thread-0正在打印信息CIRCLE=89
线程Thread-0正在打印信息CIRCLE=88
线程Thread-0正在打印信息CIRCLE=87
线程Thread-0正在打印信息CIRCLE=86
线程Thread-0正在打印信息CIRCLE=85
线程Thread-0正在打印信息CIRCLE=84
线程Thread-0正在打印信息CIRCLE=83
线程Thread-0正在打印信息CIRCLE=82
线程Thread-0正在打印信息CIRCLE=81
线程Thread-0正在打印信息CIRCLE=80
线程Thread-0正在打印信息CIRCLE=79
线程Thread-0正在打印信息CIRCLE=78
线程Thread-0正在打印信息CIRCLE=77
线程Thread-0正在打印信息CIRCLE=76
线程Thread-0正在打印信息CIRCLE=75
线程Thread-0正在打印信息CIRCLE=74
线程Thread-0正在打印信息CIRCLE=73
线程Thread-0正在打印信息CIRCLE=72
线程Thread-0正在打印信息CIRCLE=71
线程Thread-0正在打印信息CIRCLE=70
线程Thread-0正在打印信息CIRCLE=69
线程Thread-0正在打印信息CIRCLE=68
线程Thread-0正在打印信息CIRCLE=67
线程Thread-0正在打印信息CIRCLE=66
线程Thread-0正在打印信息CIRCLE=65
线程Thread-0正在打印信息CIRCLE=64
线程Thread-0正在打印信息CIRCLE=63
线程Thread-0正在打印信息CIRCLE=62
线程Thread-0正在打印信息CIRCLE=61
线程Thread-0正在打印信息CIRCLE=60
线程Thread-0正在打印信息CIRCLE=59
线程Thread-0正在打印信息CIRCLE=58
线程Thread-0正在打印信息CIRCLE=57
线程Thread-0正在打印信息CIRCLE=56
线程Thread-0正在打印信息CIRCLE=55
线程Thread-0正在打印信息CIRCLE=54
线程Thread-0正在打印信息CIRCLE=53
线程Thread-0正在打印信息CIRCLE=52
线程Thread-0正在打印信息CIRCLE=51
线程Thread-0正在打印信息CIRCLE=50
线程Thread-0正在打印信息CIRCLE=49
线程Thread-0正在打印信息CIRCLE=48
线程Thread-0正在打印信息CIRCLE=47
线程Thread-0正在打印信息CIRCLE=46
线程Thread-0正在打印信息CIRCLE=45
线程Thread-0正在打印信息CIRCLE=44
线程Thread-0正在打印信息CIRCLE=43
线程Thread-0正在打印信息CIRCLE=42
线程Thread-0正在打印信息CIRCLE=41
线程Thread-0正在打印信息CIRCLE=40
线程Thread-0正在打印信息CIRCLE=39
线程Thread-0正在打印信息CIRCLE=38
线程Thread-0正在打印信息CIRCLE=37
线程Thread-0正在打印信息CIRCLE=36
线程Thread-0正在打印信息CIRCLE=35
线程Thread-0正在打印信息CIRCLE=34
线程Thread-0正在打印信息CIRCLE=33
线程Thread-0正在打印信息CIRCLE=32
线程Thread-0正在打印信息CIRCLE=31
线程Thread-0正在打印信息CIRCLE=30
线程Thread-0正在打印信息CIRCLE=29
线程Thread-0正在打印信息CIRCLE=28
线程Thread-0正在打印信息CIRCLE=27
线程Thread-0正在打印信息CIRCLE=26
线程Thread-0正在打印信息CIRCLE=25
线程Thread-0正在打印信息CIRCLE=24
线程Thread-0正在打印信息CIRCLE=23
线程Thread-0正在打印信息CIRCLE=22
线程Thread-0正在打印信息CIRCLE=21
线程Thread-0正在打印信息CIRCLE=20
线程Thread-0正在打印信息CIRCLE=19
线程Thread-0正在打印信息CIRCLE=18
线程Thread-0正在打印信息CIRCLE=17
线程Thread-0正在打印信息CIRCLE=16
线程Thread-0正在打印信息CIRCLE=15
线程Thread-0正在打印信息CIRCLE=14
线程Thread-0正在打印信息CIRCLE=13
线程Thread-0正在打印信息CIRCLE=12
线程Thread-0正在打印信息CIRCLE=11
线程Thread-0正在打印信息CIRCLE=10
线程Thread-0正在打印信息CIRCLE=9
线程Thread-0正在打印信息CIRCLE=8
线程Thread-0正在打印信息CIRCLE=7
线程Thread-0正在打印信息CIRCLE=6
线程Thread-0正在打印信息CIRCLE=5
线程Thread-0正在打印信息CIRCLE=4
线程Thread-0正在打印信息CIRCLE=3
线程Thread-0正在打印信息CIRCLE=2
线程Thread-0正在打印信息CIRCLE=1
线程Thread-0正在打印信息CIRCLE=0
退出线程:Thread-0
退出主线程main
4)object.wait()
当一个线程执行到wait()方法时,他就进入到一个和该对象相关的等待池(Waiting Pool)中,同时失去了对象的机锁—暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,如果当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,所以wait()必须在synchronized block中调用。
5)object.notify()/notifyAll()
唤醒在当前对象等待池中等待的第一个线程/所有线程。notify()/notifyAll()也必须拥有相同对象锁,否则也会抛出IllegalMonitorStateException异常。