Java编程那些事儿100——多线程问题及处理惩罚3
副标题#e#
12.4.3 死锁
多线程编程在实际的网络措施开拓中,在客户端措施实现中利用的较量简朴,可是在处事器端措施实现中却不只是大量利用,并且会呈现比客户端更多的问题。
别的一个容易在处事器端呈现的多线程问题是——死锁。死锁指两个或两个以上的线程为了利用某个临界资源而无限制的期待下去。照旧以前面卫生间的例子来说明死锁,譬喻两小我私家都同时达到卫生间,并且两小我私家都较量规矩,第一小我私家和第二小我私家说:你先吧,第二小我私家和第一小我私家说:你先吧。这两小我私家就这样一直在相互谦逊,谁也不进入,这种现象就是死锁。这里的两小我私家就比如是线程,而卫生间在这里就是临界资源,而由于这两个线程在一直谦让,谁也不利用临界资源。
死锁不只使措施无法到达预期实现的成果,并且挥霍系统的资源,所以在处事器端措施中危害较量大,在实际的处事器端措施开拓中,需要留意制止死锁。
而死锁的检测较量贫苦,并且不必然每次都呈现,这就需要在测试处事器端措施时,有足够的耐性,仔细调查措施执行时的机能检测,假如发明执行的机能显著低落,则很大概是产生了死锁,然后再详细的查找死锁呈现的原因,并办理死锁的问题。
死锁呈现的最本质原因照旧逻辑处理惩罚不足严谨,在思量时不是很周全,所以一般需要修改措施逻辑才气够很好的办理死锁。
12.4.4 线程优先级
在日常糊口中,譬喻火车售票窗口等常常可以看到“XXX优先”,那么多线程编程中每个线程是否也可以配置优先级呢?
在多线程编程中,支持为每个线程配置优先级。优先级高的线程在列队执行时会得到更多的CPU执行时间,获得更快的响应。在实际措施中,可以按照逻辑的需要,将需要获得实时处理惩罚的线程配置成较高的优先级,而把对时间要求不高的线程配置成较量低的优先级。
在Thread类中,总规划定了三个优先级,别离为:
●MAX_PRIORITY——最高优先级
●NORM_PRIORITY——普通优先级,也是默认优先级
●MIN_PRIORITY——最低优先级
在前面建设的线程工具中,由于没有配置线程的优先级,则线程默认的优先级是NORM_PRIORITY,在实际利用时,也可以按照需要利用Thread类中的setPriority要领配置线程的优先级,该要领的声明为:
public final void setPriority(int newPriority)
假设t是一个初始化过的线程工具,需要配置t的优先级为最高,则实现的代码为:
t. setPriority(Thread. MAX_PRIORITY);
这样,在该线程执行时将得到更多的执行时机,也就是优先执行。假如由于安详等原因,不答允配置线程的优先级,则会抛出SecurityException异常。
#p#副标题#e#
下面利用一个简朴的输出数字的线程演示线程优先级的利用,实现的示例代码如下:
package priority;
/**
* 测试线程优先级
*/
public class TestPriority {
public static void main(String[] args) {
PrintNumberThread p1 = new PrintNumberThread("高优先级");
PrintNumberThread p2 = new PrintNumberThread("普通优先级");
PrintNumberThread p3 = new PrintNumberThread("低优先级");
p1.setPriority(Thread.MAX_PRIORITY);
p2.setPriority(Thread.NORM_PRIORITY);
p3.setPriority(Thread.MIN_PRIORITY);
p1.start();
p2.start();
p3.start();
}
}
package priority;
/**
* 输出数字的线程
*/
public class PrintNumberThread extends Thread {
String name;
public PrintNumberThread(String name){
this.name = name;
}
public void run(){
try{
for(int i = 0;i < 10;i++){
System.out.println(name + ":" + i);
}
}catch(Exception e){}
}
}
措施的一种执行功效为:
高优先级:0
高优先级:1
高优先级:2
普通优先级:0
高优先级:3
普通优先级:1
高优先级:4
普通优先级:2
高优先级:5
高优先级:6
高优先级:7
高优先级:8
高优先级:9
普通优先级:3
普通优先级:4
普通优先级:5
普通优先级:6
普通优先级:7
普通优先级:8
普通优先级:9
低优先级:0
低优先级:1
低优先级:2
低优先级:3
低优先级:4
低优先级:5
低优先级:6
低优先级:7
低优先级:8
低优先级:9
#p#分页标题#e#
在该示例措施,PrintNumberThread线程实现的成果是输出数字,每次数字输出之间没有配置时间延迟,在测试类TestPriority中建设三个PrintNumberThread范例的线程工具,然后别离配置线程优先级是最高、普通和最低,接着启动线程执行措施。从执行功效可以看出高优先级的线程得到了更多的执行时间,首先执行完成,而低优先级的线程由于优先级较低,所以最后一个执行竣事。
其实,对付线程优先级的打点主要由系统的线程调治实现,较高优先级的线程优先执行,所以可以通过配置线程的优先级影响线程的执行。
12.5 总结
关于多线程的基本常识就先容这么多,在本章中先容了线程的观念、线程的实现方法以及利用多线程时会碰着的问题以及办理步伐,而需要成立多线程的观念,也就是并发编程的观念还需要举办较量多的操练,领略多线程的观念并熟悉多线程的编程。
而关于多线程编程的高级常识,如线程组等则可以在熟悉了线程的根基观念今后再举办越发深入的进修。
12.6 多线程操练
1、别离利用多线程的3种实现要领,实现一个打印奇数的线程
2、别离利用多线程的3种实现要领,实现一个打印1-10000之间素数(质数)的线程
3、在操练1、操练2的基本上,插手节制台输入,当线程执行时,输入quit或exit竣事线程和措施的执行。
4、实现两个线程,一个打印奇数,一个打印偶数,每个线程的延迟时间纷歧样,实现奇数和偶数的瓜代打印。
5、模仿火车票联网售票系统:多个线程同时出票,担保每张出票的编号持续且不反复。