Java多线程问题及处理笔记

1.死锁

多线程编程在实际的网络程序开发中,在客户端程序实现中使用的比较简单 ,但是在服务器端程序实现中却不仅是大量使用,而且会出现比客户端更多的问 题。

另外一个容易在服务器端出现的多线程问题是——死锁。死锁指两个或两个 以上的线程为了使用某个临界资源而无限制的等待下去。还是以前面卫生间的例 子来说明死锁,例如两个人都同时到达卫生间,而且两个人都比较礼貌,第一个 人和第二个人说:你先吧,第二个人和第一个人说:你先吧。这两个人就这样一 直在互相礼让,谁也不进入,这种现象就是死锁。这里的两个人就好比是线程, 而卫生间在这里就是临界资源,而由于这两个线程在一直谦让,谁也不使用临界 资源。

死锁不仅使程序无法达到预期实现的功能,而且浪费系统的资源,所以在服 务器端程序中危害比较大,在实际的服务器端程序开发中,需要注意避免死锁。

而死锁的检测比较麻烦,而且不一定每次都出现,这就需要在测试服务器端 程序时,有足够的耐心,仔细观察程序执行时的性能检测,如果发现执行的性能 显著降低,则很可能是发生了死锁,然后再具体的查找死锁出现的原因,并解决 死锁的问题。

死锁出现的最本质原因还是逻辑处理不够严谨,在考虑时不是很周全,所以 一般需要修改程序逻辑才能够很好的解决死锁。

2. 线程优先级

在日常生活中,例如火车售票窗口等经常可以看到“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;
/**

  * 测试线程优先级

* author by http://www.bt285.cn http://www.5a520.cn

  */

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){}

         }

}

时间: 2025-01-29 07:55:28

Java多线程问题及处理笔记的相关文章

java多线程如何实现1加到30

问题描述 java多线程如何实现1加到30 java如何用10个线程实现从1加到100,如果不调用join每个线程都是从21开始加到30.求解决 public class thread { public static void main(String[] args) throws InterruptedException { mythread mt = new mythread(); mt.setbagin(1); Thread th1 = new Thread(mt第1个线程"");

关于java多线程中的join方法

问题描述 关于java多线程中的join方法 1.主线程可能在子线程结束之前 结束吗?如果可能的话 举一个例子 2.如何理解join方法, 结合实际应用. 非常感谢非常感谢!!! 解决方案 关于join,参考:http://www.blogjava.net/jnbzwm/articles/330549.html 解决方案二: 主线程可能在子线程结束之前 结束吗 一般来说不可以,但是也不一定,如果子线程在执行finally中的代码,应该会等它执行完了才退出. 晕,join方法和什么"让主线程等子线

实战Java多线程编程之不提倡的方法

编程|多线程 不提倡使用的方法是为支持向后兼容性而保留的那些方法,它们在以后的版本中可能出现,也可能不出现.Java 多线程支持在版本 1.1 和版本 1.2 中做了重大修订,stop().suspend() 和 resume() 函数已不提倡使用.这些函数在 JVM 中可能引入微妙的错误.虽然函数名可能听起来很诱人,但请抵制诱惑不要使用它们. 调试线程化的程序 在线程化的程序中,可能发生的某些常见而讨厌的情况是死锁.活锁.内存损坏和资源耗尽. 死锁 死锁可能是多线程程序最常见的问题.当一个线程

Java多线程编程详解

编程|多线程|详解 一:理解多线程多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单.多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是不可

Java多线程程序设计

程序|多线程|设计 一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是

Java多线程编程经验谈

编程|多线程 不管我是多么喜欢JAVA但是,从实际开发角度讲,Java的多线程确实没有C++好使. 表现在:1.Java没有全局变量:2.Java 的线程之间的通信比较差,C++提供了多种通信方式:3.Java的数据同步是通过synchronized来实现,但是基本上等于交给了虚拟机来完成,而C++有很多种:临界区.互斥体等.4. Java的多线程run方法没有返回值,因此如何能得到子线程的反馈信息,确实令人头疼.5.Java的多线程是协作式,这样等于操作系统放弃了对线程的控制: 这里谈谈我在j

深入浅出Java多线程程序设计

程序|多线程|设计 一:理解多线程 多线程是这样一种机制,它允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间互相独立. 线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度,区别在于线程没有独立的存储空间,而是和所属进程中的其它线程共享一个存储空间,这使得线程间的通信远较进程简单. 多个线程的执行是并发的,也就是在逻辑上"同时",而不管是否是物理上的"同时".如果系统只有一个CPU,那么真正的"同时"是

Java多线程:“基础篇”05之线程等待与唤醒

wait(), notify(), notifyAll()等方法介绍 在Object.java中,定义了wait(), notify()和notifyAll()等接口.wait()的作用是让当前线程进入 等待状态,同时,wait()也会让当前线程释放它所持有的锁.而notify()和notifyAll()的作用,则是唤 醒当前对象上的等待线程:notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程. Object类中关于等待/唤醒的API详细信息如下: notify()    

Java多线程:“基础篇”01之基本概念

多线程是Java中不可避免的一个重要主体.从本章开始,我们将展开对多线程的学习.接下来的内容 ,是对"JDK中新增JUC包"之前的Java多线程内容的讲解,涉及到的内容包括,Object类中的 wait(), notify()等接口:Thread类中的接口:synchronized关键字. 注:JUC包是指,Java.util.concurrent包,它是由Java大师Doug Lea完成并在JDK1.5版本添加到 Java中的. 在进入后面章节的学习之前,先对了解一些多线程的相关概念