- 浏览: 576075 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (237)
- Java (48)
- Flex3 (43)
- Spring (7)
- Hibernate (7)
- 杂文 (2)
- 设计模式 (3)
- 数据库相关 (32)
- Eclipse开发环境 (10)
- C/C++ (1)
- 随笔 (1)
- 生活点滴 (2)
- Flex4 (3)
- Oracle (6)
- SQLServer (6)
- Degrafa (1)
- ActionScript (2)
- JavaScript (11)
- MySQL (8)
- 开源项目 (4)
- AspectJ (0)
- Spring Security (1)
- SSO (0)
- PV3D (2)
- JBPM (1)
- JBoss (0)
- Tomcat (5)
- Struts (1)
- WebService (2)
- 算法 (1)
- 数据结构 (1)
- POI (2)
- Lucene (2)
- 其他 (3)
- Blazeds (2)
- Alternative 3D (0)
- Ibatis (3)
- Intellij (3)
- freemaker (0)
- Maven (5)
- web (4)
- Eclipse (1)
- velocity (1)
- Linux (7)
- CXF (3)
- html (2)
- JVM (1)
最新评论
-
jpsb:
多谢楼主,问题解决,主要就是svn版本不同导致的
Eclipse 导入本地svn项目的问题 -
yycdaizi:
lanmolsz 写道无法同意楼主的说法,楼主所谓的晚捕捉就是 ...
Java异常处理原则 -
lanmolsz:
无法同意楼主的说法,楼主所谓的晚捕捉就是典型的让异常控制程序的 ...
Java异常处理原则 -
cici_new_1987:
...
Java异常处理原则 -
雁行:
倒是怀疑这个功能来着
Eclipse 导入本地svn项目的问题
关于java多线程经典文章收集:
1.http://www.iteye.com/topic/158377;
2.http://lemhion.iteye.com/blog/223674;
3. http://www.iteye.com/topic/170093;
正文转载自:http://www.iteye.com/topic/158377
多线程
线程:是指进程中的一个执行流程。
线程与进程的区别:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中工作,这些线程可以共享同一块内存和系统资源。
如何创建一个线程?
创建线程有两种方式,如下:
1、 扩展java.lang.Thread类
2、 实现Runnable接口
Thread类代表线程类,它的两个最主要的方法是:
run()——包含线程运行时所执行的代码
Start()——用于启动线程
一个线程只能被启动一次。第二次启动时将会抛出java.lang.IllegalThreadExcetpion异常
线程间状态的转换(如图示)
新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存
就绪状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的线程位于可运行池中,等待获得CPU的使用权
运行状态:处于这个状态的线程占用CPU,执行程序的代码
阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。
阻塞状态分为三种情况:
1、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中
2、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。
3、 其它的阻塞状态:当前线程执行了sleep()方法,或者调用了其它线程的join()方法,或者发出了I/O请求时,就会进入这个状态中。
死亡状态:当线程退出了run()方法,就进入了死亡状态,该线程结束了生命周期。
或者正常退出
或者遇到异常退出
Thread类的isAlive()方法判断一个线程是否活着,当线程处于死亡状态或者新建状态时,该方法返回false,在其余的状态下,该方法返回true.
线程调度
线程调度模型:分时调度模型和抢占式调度模型
JVM采用抢占式调度模型。
所谓的多线程的并发运行,其实是指宏观上看,各个线程轮流获得CPU的使用权,分别执行各自的任务。
(线程的调度不是跨平台,它不仅取决于java虚拟机,它还依赖于操作系统)
如果希望明确地让一个线程给另外一个线程运行的机会,可以采取以下的办法之一
1、 调整各个线程的优先级
2、 让处于运行状态的线程调用Thread.sleep()方法
3、 让处于运行状态的线程调用Thread.yield()方法
4、 让处于运行状态的线程调用另一个线程的join()方法
调整各个线程的优先级
Thread类的setPriority(int)和getPriority()方法分别用来设置优先级和读取优先级。
如果希望程序能够移值到各个操作系统中,应该确保在设置线程的优先级时,只使用MAX_PRIORITY、NORM_PRIORITY、MIN_PRIORITY这3个优先级。
线程睡眠:当线程在运行中执行了sleep()方法时,它就会放弃CPU,转到阻塞状态。
线程让步:当线程在运行中执行了Thread类的yield()静态方法时,如果此时具有相同优先级的其它线程处于就绪状态,那么yield()方法将把当前运行的线程放到运行池中并使另一个线程运行。如果没有相同优先级的可运行线程,则yield()方法什么也不做。
Sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程,两者的区别在于:
1、sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低线程一个运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
2、当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。
3、sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常
4、sleep()方法比yield()方法具有更好的移植性
等待其它线程的结束:join()
当前运行的线程可以调用另一个线程的 join()方法,当前运行的线程将转到阻塞状态,直到另一个线程运行结束,它才恢复运行。
定时器Timer:在JDK的java.util包中提供了一个实用类Timer, 它能够定时执行特定的任务。
线程的同步
原子操作:根据Java规范,对于基本类型的赋值或者返回值操作,是原子操作。但这里的基本数据类型不包括long和double, 因为JVM看到的基本存储单位是32位,而long 和double都要用64位来表示。所以无法在一个时钟周期内完成。
自增操作(++)不是原子操作,因为它涉及到一次读和一次写。
原子操作:由一组相关的操作完成,这些操作可能会操纵与其它的线程共享的资源,为了保证得到正确的运算结果,一个线程在执行原子操作其间,应该采取其他的措施使得其他的线程不能操纵共享资源。
同步代码块:为了保证每个线程能够正常执行原子操作,Java引入了同步机制,具体的做法是在代表原子操作的程序代码前加上synchronized标记,这样的代码被称为同步代码块。
同步锁:每个JAVA对象都有且只有一个同步锁,在任何时刻,最多只允许一个线程拥有这把锁。
当一个线程试图访问带有synchronized(this)标记的代码块时,必须获得 this关键字引用的对象的锁,在以下的两种情况下,本线程有着不同的命运。
1、 假如这个锁已经被其它的线程占用,JVM就会把这个线程放到本对象的锁池中。本线程进入阻塞状态。锁池中可能有很多的线程,等到其他的线程释放了锁,JVM就会从锁池中随机取出一个线程,使这个线程拥有锁,并且转到就绪状态。
2、 假如这个锁没有被其他线程占用,本线程会获得这把锁,开始执行同步代码块。
(一般情况下在执行同步代码块时不会释放同步锁,但也有特殊情况会释放对象锁
如在执行同步代码块时,遇到异常而导致线程终止,锁会被释放;在执行代码块时,执行了锁所属对象的wait()方法,这个线程会释放对象锁,进入对象的等待池中)
线程同步的特征:
1、 如果一个同步代码块和非同步代码块同时操作共享资源,仍然会造成对共享资源的竞争。因为当一个线程执行一个对象的同步代码块时,其他的线程仍然可以执行对象的非同步代码块。(所谓的线程之间保持同步,是指不同的线程在执行同一个对象的同步代码块时,因为要获得对象的同步锁而互相牵制)
2、 每个对象都有唯一的同步锁
3、 在静态方法前面可以使用synchronized修饰符。
4、 当一个线程开始执行同步代码块时,并不意味着必须以不间断的方式运行,进入同步代码块的线程可以执行Thread.sleep()或者执行Thread.yield()方法,此时它并不释放对象锁,只是把运行的机会让给其他的线程。
5、 Synchronized声明不会被继承,如果一个用synchronized修饰的方法被子类覆盖,那么子类中这个方法不在保持同步,除非用synchronized修饰。
线程安全的类:
1、 这个类的对象可以同时被多个线程安全的访问。
2、 每个线程都能正常的执行原子操作,得到正确的结果。
3、 在每个线程的原子操作都完成后,对象处于逻辑上合理的状态。
释放对象的锁:
1、 执行完同步代码块就会释放对象的锁
2、 在执行同步代码块的过程中,遇到异常而导致线程终止,锁也会被释放
3、 在执行同步代码块的过程中,执行了锁所属对象的wait()方法,这个线程会释放对象锁,进入对象的等待池。
死锁
当一个线程等待由另一个线程持有的锁,而后者正在等待已被第一个线程持有的锁时,就会发生死锁。JVM不监测也不试图避免这种情况,因此保证不发生死锁就成了程序员的责任。
如何避免死锁
一个通用的经验法则是:当几个线程都要访问共享资源A、B、C 时,保证每个线程都按照同样的顺序去访问他们。
线程通信
Java.lang.Object类中提供了两个用于线程通信的方法
1、 wait():执行了该方法的线程释放对象的锁,JVM会把该线程放到对象的等待池中。该线程等待其它线程唤醒
2、 notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程,JVM从对象的等待池中随机选择一个线程,把它转到对象的锁池中。
发表评论
-
【转载】8张图理解Java
2015-12-23 13:44 851一图胜千言,下面图解均来自Program Creek 网站 ... -
【转载】JAVA多线程与并发学习总结
2015-12-17 13:23 968本文转载自:http://www.cnblogs.co ... -
关于MAT分析工具中的Shallow heap & Retained heap
2015-11-26 10:58 1382本文转载自:http://bjyzxxds.iteye.c ... -
触发JVM进行Full GC的情况及应对策略
2015-11-10 14:10 3197转载自:http://blog.csdn.net/chen ... -
JVM内存参数详解以及配置调优
2015-10-26 20:21 877本文转载自:http://www ... -
[转载]在线数据迁移经验:如何为正在飞行的飞机更换引擎
2015-02-25 15:49 912转载自:http://www.infoq.c ... -
java.lang.OutOfMemoryError: unable to create new native thread问题诊断
2014-10-27 18:34 612转载自:http://www.blogjava.net/l ... -
JVM调优总结 -Xms -Xmx -Xmn -Xss
2014-10-14 09:28 818本文转载自:http://unixboy.iteye.co ... -
JVM参数分析
2014-01-26 19:54 1155转载自: http:// ... -
Java的getByte()方法解析
2014-01-17 13:28 1498转载自: http://bijian1013. ... -
httpClient处理乱码
2014-01-10 12:08 794利用HttpClient模拟Http请求访问页面 ... -
Tomcat 生产服务器性能优化
2013-11-13 19:45 894转载自:http://www.oschina.net/tra ... -
JVM内存配置
2013-07-11 09:34 1284原文地址:http://vanadiu ... -
Jackson序列化和反序列化
2013-04-29 16:29 2241Jackson使用备忘 Jackson主要使用 ... -
Mysql连接异常
2013-04-29 15:47 1104在连接Mysql数据库后,查询时报错: The l ... -
浅谈SQL Server中的快照
2012-12-31 09:32 1203简介 数据库快照,正如其名称所示那样,是数据库在 ... -
使用IBM heapAnalyzer分析heap dump文件步骤
2012-12-18 21:38 298751. ... -
Spring防止重复ID命名
2012-08-17 16:34 12061、同一个spring配置文件不允许重复ID,这个不需要 ... -
Java异常处理原则
2012-02-21 16:36 8782关于异常处理的一篇文章 异常处理机制 ... -
Intellij常用快捷键收集
2012-01-04 15:22 1102Alt+回车 导入包,自动修正 Ctrl+N 查 ...
相关推荐
### Java分布式应用学习笔记05多线程下的并发同步器 #### 1. 前言 在现代软件开发中,特别是在分布式系统和高性能计算领域,有效地管理多线程之间的协同工作至关重要。Java语言提供了丰富的工具和API来帮助开发者...
通过上述知识点,我们可以理解Java中线程启动的原理和机制,以及如何在实践中有效地利用多线程来优化程序的执行。在编写`test`这样的示例时,你可以创建并启动线程,测试各种线程控制和同步方法,从而加深对Java线程...
本篇文章将深入探讨Java多线程的原理、实现方式以及常见问题。 1. **线程的创建** Java提供了多种创建线程的方法。一种是通过继承`Thread`类,重写`run()`方法,并调用`start()`启动线程。另一种是实现`Runnable`...
5. **多线程**:Java提供内置支持来创建和管理多线程,这是处理并发的关键。文章可能会介绍线程的生命周期、同步机制(如synchronized关键字和锁),以及线程池的使用。 6. **I/O流**:Java的I/O流系统使得数据读写...
本专题涵盖了20多篇关于Java线程的精选技术文章,涉及了多个关键领域,如死锁、合并、休眠、优先级、阻塞等。以下是对这些主题的详细阐述: 1. **条件变量**: 条件变量是Java线程通信的一种机制,用于在特定条件...
很多核心Java面试题来源于多线程(Multi-Threading)和集合框架(Collections Framework),理解核心线程概念时,娴熟的实际经验是必需的。这篇文章收集了 Java 线程方面一些典型的问题,这些问题经常被高级工程师所问到...
此外,为了提高性能和可扩展性,Java开发的TF-IDF程序可能采用了多线程处理、数据缓存等技术。同时,对于大规模文本数据,可能需要使用分布式计算框架,如Hadoop或Spark,以实现并行化处理。 总的来说,Java编写的...
此外,IO流、网络编程、多线程、并发控制、反射机制等也是中级Java开发者需要掌握的重要内容。 在面向对象设计中,设计模式是一个重要的主题。499篇文章中可能包含各种常见的设计模式,如工厂模式、单例模式、装饰...
本压缩包文件“Java精品文章收集”中,很可能包含了关于Java编程的各种深入探讨和实践分享。 在Java的世界里,重要概念包括类、对象、封装、继承、多态等。类是对象的模板,定义了对象的属性和行为;对象是类的实例...
2. **Java进阶特性**:可能涉及泛型、枚举、注解、反射、动态代理、多线程、集合框架(List、Set、Map等)、IO流、NIO、Lambda表达式、Stream API、Optional类等。 3. **Java内存管理**:深入讲解JVM(Java虚拟机)...
C# Socket 多线程编程实例 C# 是微软随着 VS.net 新推出的语言,它具有 C++ 的强健和 VB 等的 RAD 特性。微软推出 C# 主要是为了对抗 Sun 公司的 Java。C# 在网络编程方面也自然不甘落后于人。这篇文章主要介绍 C# ...
4. **多线程**:Java提供内置支持进行并发编程,包括Thread类、Runnable接口、synchronized关键字、volatile变量以及并发集合类如ConcurrentHashMap。 5. **IO/NIO**:Java I/O系统允许读写文件、网络通信,而New ...
5. **多线程** - 线程创建:通过实现Runnable接口或继承Thread类创建线程,理解线程的生命周期和状态转换。 - 同步机制:synchronized关键字、wait/notify机制、Lock接口(如ReentrantLock)用于控制并发访问,...
2. **掌握核心API**:学习集合框架(如List、Set、Map)、IO流、NIO、网络编程、多线程、并发工具类等,这些都是编写高效Java程序的基础。 3. **探讨设计模式**:如单例、工厂、观察者、装饰器、适配器等23种经典...
这篇博客文章(链接已提供)可能会深入探讨Java线程的创建、启动、同步和通信机制。 1. **线程创建**: - **直接继承Thread类**:创建一个新的类,该类直接继承自`Thread`类,然后重写`run()`方法。创建实例后调用...
在实际开发中,理解并熟练运用这些Java线程管理的概念和技术是至关重要的,能够帮助我们编写出高效、安全的多线程应用程序。通过阅读和研究`threads_java-master`这个压缩包中的代码示例,可以更直观地了解这些知识...
5. **线程与并发**:为了提高爬取效率,程序可能使用多线程或异步处理。Java的并发API(如ExecutorService、Thread、synchronized关键字等)可以帮助实现这一目标。 6. **文件I/O操作**:抓取到的文章数据需要保存...
5. **多线程**:Java内置了对多线程的支持,理解如何创建和管理线程,以及同步机制(如synchronized关键字、wait()、notify()等)对于构建高效的并发程序至关重要。 6. **反射机制**:反射允许程序在运行时动态访问...
5. **多线程**:掌握线程的创建与管理,线程同步与通信机制,如synchronized、volatile、Lock接口等。 6. **网络编程**:理解Socket编程,了解TCP/IP协议,以及如何在JAVA中实现网络通信。 7. **JAVA反射机制**:...