控制线程
java的线程提供了一些方法,通过这些方法我们可以很方便的对线程进行控制。
join方法
当在某个线程中通过另一线程对象调用join方法时,调用者将会被阻塞,直到join方法加入的join线程完成为止。
MyThread thread = new MyThread(); // 创建一个线程对象
thread.start(); // 启动线程
thread.join(); // 调用对象的join方法,这是代码运行所在的线程对阻塞直到thread完成为止
- join():等待这join的线程完成
- join(long millis):等待join的线程millis毫秒。如果在millis毫秒内被join的线程未完成,被阻塞线程也会进入就绪状态
- join(long millis, int nanos):同同上,nanos是微秒值
sleep方法
可以让调用的线程暂停时段时间,并且进入阻塞状态。
Thread.sleep(1000);
- static void sleep(long millis):让当前执行的线程暂停millis毫秒,并进入阻塞状态
- static void sleep(long millis, int nanos)
yield方法
让当前执行的线程暂停并且直接进入就绪状态
Thread.yield();
sleep和yield的区别
1. sleep方法暂停当前线程之后,会给其他线程执行机会,不会理会其他线程的优先级。但yield方法只会给优先级相同,或者优先级更高的线程执行机会。
2. sleep方法会将线程进入阻塞状态,直到阻塞完成之后进入就绪状态。而yield方法不会使线程进入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用了yield方法之后,立即在获得cpu资源后执行。
3. sleep方法声明了interrupateException,所以调用sleep方法时要么捕捉异常,要么显示声明抛出该异常。而yield方法则没有声明抛出任何异常。
4. sleep方法比yield方法有更好的可移植性。
线程优先级
优先级越高获得cpu的机会越多;setPriority(int newPriority)和getPriority()来设置和返回制定线程的优先级。其中set方法的参数是一个整数,范围是1~10。在设置线程优先级的时候尽量避免用数字,而要使用Thread的静态常量:MAX_PRIORITY、MIN_PRIORITY、NORM_PRIORITY;这是为了保持最好的可移植性。