在Java中有优先级别可以从1到10,其中1可以用Thread.MIN_PRIORITY表示,5可以用Thread.NORM_PRIORITY,10可以用 Thread.MAX_PRIORITY表示,新建一个线程默认的级别是Thread.NORM_PRIORITY。也可以使用setPriority方法改变线程的优先级别,如T1.setPriority(T2.getPriority + 1)。
与yield方法相反的是join方法,它表示一直要等到指定的线程运行完毕,如:
try{ t.join();} catch (InterruptedException ignored) { }
表示要等到线程t运行完毕后,再执行下一步操作。这种情况比较少见。
1.4 synchronized
为了保证某个方法或者对象某个时刻只能被一个方法访问,那就需要使用synchronized关键字。
如:
public synchronized void countMe() {
crucialValue += 1;
}
就表示countMe这个方法中的操作是一个原子操作,+= 要执行三个步骤,使用synchronized后,这三个步骤是具有原子性,即在三个步骤完成前,其它对于crucialValue的访问都将被拒绝,即可保证countMe的线程安全。
另一个例子:
synchronized(p) {
safeX = p.x();
safeY = p.y();
}
表示在block范围内锁定p对象,不许其它程序修改p对象中的值。
以上代码的作用都是保护某个对象内的变量不能同时被多个线程访问,下面介绍如何保护class variable的线程安全:
public class StaticCounter {
private static int crucialValue;
public void countMe() {
synchronized(getClass()) {
crucialValue += 1;
} } }
说明:
(1) 在这个例子中,crucialValue是private并且static,这表示它可以被该类的所有实例访问;
(2) synchronized使用getClass方法获取类名,而不能直接使用StaticCounter
(3) 如果crucialValue是public的,那么修改代码成:
synchronized(Class.forName("StaticCounter")) {
StaticCounter.crucialValue += 1;
}
文章来源于领测软件测试网 https://www.ltesting.net/