- 浏览: 31466 次
- 性别:
- 来自: 天津
最近访客 更多访客>>
最新评论
-
confident_f:
这个链接打不开了,可有其他途径找到这个材料
Spring Security-2.0入门教程 -
阳光晒晒:
看不到把传送门发出来
风雨过后见彩虹
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){}
}
}
程序的一种执行结果为:
高优先级: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
在该示例程序,PrintNumberThread线程实现的功能是输出数字,每次数字输出之间没有设置时间延迟,在测试类TestPriority中创建三个PrintNumberThread类型的线程对象,然后分别设置线程优先级是最高、普通和最低,接着启动线程执行程序。从执行结果可以看出高优先级的线程获得了更多的执行时间,首先执行完成,而低优先级的线程由于优先级较低,所以最后一个执行结束。
其实,对于线程优先级的管理主要由系统的线程调度实现,较高优先级的线程优先执行,所以可以通过设置线程的优先级影响线程的执行。
5 总结
关于多线程的基础知识就介绍这么多,在本章中介绍了线程的概念、线程的实现方式以及使用多线程时会遇到的问题以及解决办法,而需要建立多线程的概念,也就是并发编程的概念还需要进行比较多的练习,理解多线程的概念并熟悉多线程的编程。
而关于多线程编程的高级知识,如线程组等则可以在熟悉了线程的基本概念以后再进行更加深入的学习。
posted width = "1" height = "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){}
}
}
程序的一种执行结果为:
高优先级: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
在该示例程序,PrintNumberThread线程实现的功能是输出数字,每次数字输出之间没有设置时间延迟,在测试类TestPriority中创建三个PrintNumberThread类型的线程对象,然后分别设置线程优先级是最高、普通和最低,接着启动线程执行程序。从执行结果可以看出高优先级的线程获得了更多的执行时间,首先执行完成,而低优先级的线程由于优先级较低,所以最后一个执行结束。
其实,对于线程优先级的管理主要由系统的线程调度实现,较高优先级的线程优先执行,所以可以通过设置线程的优先级影响线程的执行。
5 总结
关于多线程的基础知识就介绍这么多,在本章中介绍了线程的概念、线程的实现方式以及使用多线程时会遇到的问题以及解决办法,而需要建立多线程的概念,也就是并发编程的概念还需要进行比较多的练习,理解多线程的概念并熟悉多线程的编程。
而关于多线程编程的高级知识,如线程组等则可以在熟悉了线程的基本概念以后再进行更加深入的学习。
posted width = "1" height = "1" />
发表评论
-
关于调整部分政府性基金有关政策的通知
2019-07-15 20:42 365摘要: 允许抵免的投资是指试点企业当年实际发生的,独立举办或 ... -
我最近的工作
2009-08-21 11:47 7751:浪潮服务器 曙光服务器 尖锐湿疣等关键字的排名 2:淘宝上 ... -
09游记·夏:天边的云
2009-07-21 17:08 763[img=560,309]http://hiphoto ... -
玩轮滑的人们
2009-07-05 17:08 960轮滑之所以深受大众的 ... -
蜜月滇藏游(8)香格里拉-美的绚烂美的妖娆
2009-06-27 17:08 789中国国家地理对于广义的香格里拉定义是:从西藏东南部林芝地区到滇 ... -
印尼的天空很归属。
2009-06-19 17:08 999在印度尼西亚没有高楼 ... -
Tapestry最新版5.1.0.5教程(二)续
2009-06-14 08:13 892Tapestry最新版5.1.0.5教程(二)续 ... -
spring junit 测试
2009-06-14 08:01 1346spring junit 测试 Poste ... -
TWaver3.0 SVG WebRadar Chart
2009-06-14 07:58 1008TWaver3.0 SVG WebRadar Chart ... -
Duke's Choice Award 2009(译)
2009-06-14 07:55 720Duke's Choice Award 2009(译) ... -
环境无关的环境
2009-06-14 07:45 785环境无关的环境 Pos ... -
唯美颐和园:中国传统文化的胜景
2009-06-11 17:08 870标帜建筑昆明湖前的万寿山上的佛香阁十六孔桥石栏水景塔昆明湖佛香 ... -
风雨过后见彩虹
2009-06-10 15:51 817~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ... -
RAP的超酷应用系统:CAS PIA
2009-06-09 07:40 916RAP的超酷应用系统:CAS PIA 下面是基于RA ... -
Tapestry最新版5.1.0.5教程(三)
2009-06-06 09:37 1094Tapestry最新版5.1.0.5教程(三) P ... -
Spring Security-2.0入门教程
2009-06-05 07:22 1350Spring Security-2.0入门教程 欢迎 ... -
(Multi-stage Continuous Integration)多阶段持续集成
2009-06-04 06:44 574BlogJava 首页 新随笔 联系 聚合 ... -
Linux批量替换文件内容
2009-06-02 08:23 2147Linux批量替换文件内容 Posted widt ... -
ubuntu 8.10下手动安装vmvare tools
2009-06-02 08:20 1337ubuntu 8.10下手动安装vmvare tools ... -
webservice 视频教程 Spring+xfire 整合
2009-06-02 08:17 4736webservice 视频教程 Spring+xfire 整合 ...
相关推荐
Java多线程笔记 Java多线程笔记是 Java 编程语言中关于多线程编程的笔记,涵盖了线程基础知识、线程优先级、线程状态、守护线程、构造线程、线程中断等多方面的内容。 获取简单 main 程序中的线程 在 Java 中,...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
Java线程的知识点总结。doc
基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码.zip 基于java的开发源码-java多线程反射泛型及正则表达式学习笔记和源码....
通过阅读`多线程笔记.doc`和运行`threadDemo`示例代码,你可以对Java多线程有更深入的理解,并能够在实际项目中灵活运用这些知识,解决并发问题。同时,博客地址提供了更多详细内容,可以帮助你进一步探索和实践。
java学习笔记2(多线程)java学习笔记2(多线程)
### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
Java多线程详解 在Java编程中,多线程是一种重要的技术,它使得程序能够同时执行多个任务,提高系统的效率和响应性。本教程将详细讲解Java中的多线程概念,包括线程的创建、状态、同步以及高级主题,旨在帮助初学者...
读书笔记:《图解 Java 多线程设计模式》 笔记
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。
java学习笔记5(java多线程)java学习笔记5(java多线程)
Java 多线程基础笔记
java多线程并发编程知识导图笔记.xmind
java多线程笔记分享
### Java多线程自学笔记知识点总结 #### 一、Java多线程概念 - **多线程定义**:多线程是指程序中可以同时执行多个线程的能力。Java虚拟机支持多线程机制,允许应用程序在不同的线程上并行执行任务。 - **线程特点...
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
使用java.lang.Thread类或者java.lang.Runnable接口编写代码来定义、实例化和启动新线程。 一个Thread类实例只是一个对象,像Java中的任何其他对象一样,具有变量和方法,生死于堆上。 Java中,每个线程都有一个...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,从而提高系统的效率和响应性。多线程在操作系统层面是通过进程和线程实现的,而Java则提供了一套丰富的API来支持多线程编程。 在操作系统...