死锁
多线程编程在实际的网络程序开发中在客户端程序实现中使用的比较简单但是在服务器端程序实现中却不仅是大量使用而且会出现比客户端更多的问题另外一个容易在服务器端出现的多线程问题是死锁死锁指两个或两个以上的线程为了使用某个临界资源而无限制的等待下去还是以前面卫生间的例子来说明死锁例如两个人都同时到达卫生间而且两个人都比较礼貌第一个人和第二个人说你先吧第二个人和第一个人说你先吧这两个人就这样一直在互相礼让谁也不进入这种现象就是死锁这里的两个人就好比是线程而卫生间在这里就是临界资源而由于这两个线程在一直谦让谁也不使用临界资源死锁不仅使程序无法达到预期实现的功能而且浪费系统的资源所以在服务器端程序中危害比较大在实际的服务器端程序开发中需要注意避免死锁而死锁的检测比较麻烦而且不一定每次都出现这就需要在测试服务器端程序时有足够的耐心仔细观察程序执行时的性能检测如果发现执行的性能显着降低则很可能是发生了死锁然后再具体的查找死锁出现的原因并解决死锁的问题死锁出现的最本质原因还是逻辑处理不够严谨在考虑时不是很周全所以一般需要修改程序逻辑才能够很好的解决死锁
线程优先级
在日常生活中例如火车售票窗口等经常可以看到XXX优先那么多线程编程中每个线程是否也可以设置优先级呢?在多线程编程中支持为每个线程设置优先级优先级高的线程在排队执行时会获得更多的CPU执行时间得到更快的响应在实际程序中可以根据逻辑的需要将需要得到及时处理的线程设置成较高的优先级而把对时间要求不高的线程设置成比较低的优先级在Thread类中总计规定了三个优先级分别为
l MAX_PRIORITY最高优先级
l NORM_PRIORITY普通优先级也是默认优先级
l MIN_PRIORITY最低优先级
在前面创建的线程对象中由于没有设置线程的优先级则线程默认的优先级是NORM_PRIORITY在实际使用时也可以根据需要使用Thread类中的setPriority方法设置线程的优先级该方法的声明为public final void setPriority(int newPriority)
假设t是一个初始化过的线程对象需要设置t的优先级为最高则实现的代码为t setPriority(Thread MAX_PRIORITY)这样在该线程执行时将获得更多的执行机会也就是优先执行如果由于安全等原因不允许设置线程的优先级则会抛出SecurityException异常下面使用一个简单的输出数字的线程演示线程优先级的使用实现的示例代码如下
package priority;
public class TestPriority {
public static void main(String[] args) {
PrintNumberThread p = new PrintNumberThread(高优先级)
PrintNumberThread p = new PrintNumberThread(普通优先级)
PrintNumberThread p = new PrintNumberThread(低优先级)
psetPriority(ThreadMAX_PRIORITY)
psetPriority(ThreadNORM_PRIORITY)
psetPriority(ThreadMIN_PRIORITY)
pstart()
) pstart()
package priority;
{/* 输出数字的线程*/
public class PrintNumberThread extends Thread {
String name; {
public PrintNumberThread(String name){
thisname = name;}
public void run(){
try{
for(int i = ;i < ;i++){
Systemoutprintln(name + : + i)
}
}catch(Exception e){} } }
在该示例程序PrintNumberThread线程实现的功能是输出数字每次数字输出之间没有设置时间延迟在测试类TestPriority中创建三个PrintNumberThread类型的线程对象然后分别设置线程优先级是最高普通和最低接着启动线程执行程序从执行结果可以看出高优先级的线程获得了更多的执行时间首先执行完成而低优先级的线程由于优先级较低所以最后一个执行结束其实对于线程优先级的管理主要由系统的线程调度实现较高优先级的线程优先执行所以可以通过设置线程的优先级影响线程的执行
总结
关于多线程的基础知识就介绍这么多在本章中介绍了线程的概念线程的实现方式以及使用多线程时会遇到的问题以及解决办法而需要建立多线程的概念也就是并发编程的概念还需要进行比较多的练习理解多线程的概念并熟悉多线程的编程而关于多线程编程的高级知识如线程组等则可以在熟悉了线程的基本概念以后再进行更加深入的学习