黑马程序员学习笔记七——多线程
来源:互联网 发布:电脑怎么使用手机网络 编辑:程序博客网 时间:2024/06/10 08:49
多线程
1.初识线程
进程和线程区别
进程是一个正在执行的程序,每一个进程执行都有一个执行顺序。该顺序是一个执 行路径,或者称之为一个控制单元。
线程就是进程中一个独立的控制单元。线程控制进程的执行。
所以一个进程中至少有一个线程。
Java中的主线程:.jvm启动时会有一个进程java。exe 该进程至少有一个线程负责java程序的运行。而且这个线程运行的代码存在于main方法中,那么这个线程称之为主线程。
*更多细节说明jvm启动的不止一个线程。例如还有负责垃圾回收机制的线程。
当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的进程。
后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。
前台线程:是指接受后台线程服务的线程,其实前台后台线程是联系在一起,就像傀儡和幕后操纵者一样的关系。傀儡是前台线程、幕后操纵者是后台线程。由前台线程创建的线程默认也是前台线程。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。
2.Java与多线程
Java语言的多线程需要操作系统的支持。
Java 虚拟机允许应用程序并发地运行多个执行线程。Java语言提供了多线程编程的扩展点,并给出了功能强大的线程控制API。在Java中,多线程的实现有两种方式:
扩展java.lang.Thread类
实现java.lang.Runnable接口
即将类声明为Thread子类,该子类应重写Thread类的Run方法。另一种是声明实现Runable接口的类,该类应实现run方法。
例:
public class Test extends Thread{ //该类继承thread类
Test(String name){
super(name);
}
public void run(){ //重写thread子类run 方法。
for(int x=0;x<60;x++){
System.out.println(this.getName()+"**"+x);
}
}
}
public class Consumer implements Runnable{ //实现Runable 接口。
private Resource res;
Consumer(Resource res){
this.res=res;
}
public void run(){ //复写Runable 接口子类run方法。
res.out();
}
}
在这里。Threa 类用于描述线程,该线程就定义了一个功能用于存储要运行的代码。这个功能就是run 方法。
*几个常见操作:static Thhread.CurrentThread();获取当前对象。
getname()获取线程名称。
setname();设置线程名称。
*注意:Thread中suspend()和resume()两个方法在JDK1.5中已经过时,不再介绍。因为有死锁倾向。
3.实现和继承的区别:
建议实现方式避免了单继承的局限性,在定义线程建议使用实现方式。
区别:继承Thread 编程代码存放在Thread子类run方法中。
实现Runnable 编程代码存在接口的子类run 方法中。
4.多线程运行出现的安全问题。
原因:当多余语句在操作同一线程共享数据时,一个线程多条语句只执行了一部分,还没有执行完。另一个线程参与进来执行。导致共享数据错误。
解决方案:对多条语句共享数据的语句只能让没有时间段让一个线程都执行完。在执行过程中,其他线程不可以参与执行。
Java对于线程安全问题也提供了一个专业解决工具。就是同步代码块。
Synchronized(对象){需要被同步的代码}
**同步前提:
(a)必须有两个或者两个以上线程需要同步
(b)必须是多个线程使用 同一个锁才能同步
(c)必须保证同步中有一个线程在运行。
5.线程状态
a、新建状态(New):新创建了一个线程对象。
b、就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
c、运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
d、阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程被notify(),或者notifyAll()进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(1)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
d、死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
- 黑马程序员学习笔记七——多线程
- 黑马程序员-JAVA基础学习笔记七——多线程学习大总结
- 黑马程序员——多线程学习笔记
- 黑马程序员—学习笔记—多线程
- 黑马程序员—多线程学习笔记
- 黑马程序员——Java学习日记(七)多线程
- 黑马程序员——Java学习笔记(七)
- 黑马程序员——JAVA学习笔记(七)
- “黑马程序员”学习笔记七
- 黑马程序员—多线程学习
- 黑马程序员——学习笔记——多线程
- 黑马程序员——JAVA学习笔记——多线程
- 黑马程序员 JAVA学习笔记 ——— 多线程
- 黑马程序员——多线程学习笔记日志
- 黑马程序员——多线程学习笔记(一)
- 黑马程序员——多线程学习笔记(二)
- 黑马程序员——学习笔记06.Java多线程
- 黑马程序员 java学习笔记——多线程1
- 黑马程序员学习笔记八——java高新技术
- iphone调用系统电话、浏览器、地图、邮件等
- SIM300 AT
- 类目(Category)概述
- 让一个UIImageView响应点击事件
- 黑马程序员学习笔记七——多线程
- NSTimer的用法
- SQL注入式攻击
- JSP 引擎工作原理
- uva 113 - Power of Cryptography
- com.opensymphony.xwork2.spring.SpringObjectFactory.getClassInstance
- .net c# 用代码来添加断点并且在Visual Studio输出窗口中显示自定义信息
- 完整详尽的二叉排序树性质及源码和注释 C语言 可直接运行
- android canvas的清空 !!!!!!头痛,,,,,,,哎