Java多线程机制
来源:互联网 发布:文案网站 知乎 编辑:程序博客网 时间:2024/06/05 12:45
多线程是java的特色之一,掌握多线程编程技术,可以充分利用CPU的资源,更容易解决实际中的问题。
1.进程与线程
一、操作系统与进程
程序是一段静态的的代码,是应用软件执行的蓝本。进程是程序的一次动态执行过程,它对应了了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至死亡的过程。
二、进程与线程
线程是比进程更小的执行单位,一个进程在执行过程中,可以产生多个线程,形成多条执行线索,每条线索,即每个线程也有他自身的产生、执行、消亡的过程。’
2.Java中的线程
一、Java的多线程机制
Java语言的一大特性点就是内置对多线程的支持。多线程是指一个应用程序中同时存在几个执行体,按几条不同的执行线索共同工作的情况,他可以使编程人员可以很方便的开发出具有多线程功能、能同时处理多个任务的功能强大的应用程序。
二、主线程
每个Java应用程序都一个缺省的主线程。Java应用程序总是从主类的main方法开始执行。当JVM加载代码,发现main方法之后,就会启动一个线程,这个线程称为主线程,该线程负责执行main方法。那么,在main方法的执行中在创建的线程,称为程序中的其他线程。如果main方法中没有创建其他的线程,那么当main方法执行完最后一条语句,即main方法返回时,JVM就会结束我们的Java应用程序。如果main方法中又创建了其他线程,那么JVM就要在主线程和其他线程之间轮流切换,保证每个线程都有机会使用CPU,主线程结束,JVM也不会结束Java应用程序,JVM要一直等到Java中所有线程结束后才结束Java应用程序。
三、现成的状态与生命周期
1.新建
当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。此时它已经有了相应的内存和其他资源。
2.运行
线程创建之后就具备了运行的条件,JVM将CPU使用权切换到该线程时,此线程就可以脱离创建它的主线程独立开始自己的生命周期。线程创建后仅仅是占有了内存的资源,在JVM管理的线程中还没有这个线程,此线程必须调用start();方法通知JVM,这样JVM就知道有一个新进程排队等候切换。
当JVM将CPU使用权切换到线程时,如果是Thread的子类创建时,该类中的run()方法立即执行,run()方法规定了该线程的具体使命,所以必须在子类中重写父类的run();方法,原因是Thread类中的run();没有具体内容。
3.中断
有四种原因的中断
(1)JVM将CPU资源从当前线程切换到其他线程,使本线程让出CPU的使用权切换到其他进程处于中断状态。
(2)线程使用CPU资源期间,执行了sleep();方法使线程进入了休眠状态,就立即让出CPU的使用权,使当前线程处于中断状态,经过参数指定的毫秒后,重新进入到进程队列中等待CPU资源,以便从中断处继续运行。
(3)线程使用CPU资源期间,执行了wait();方法,使当前线程进入等待状态。等待状态的线程不会主动进入线程队列中排队等待CPU资源必须由其他线程调用notify();方法通知它,才能重新进入到进程队列中等待CPU资源。
(4)线程使用CPU资源期间,执行某个操作进入阻塞状态。进入阻塞状态的线程不能进入线程队列中排队等待CPU资源,当引起阻塞的原因消除时,才能重新进入到进程队列中等待CPU资源
4.死亡
处于死亡状态的线程不再具有继续运行的能力。线程死亡的原因有二:一是正常运行的线程完成了它的全部工作;另一种时进程被提前的强制性的终止。所谓死亡状态就是线程释放了实体,即释放分配给进程的内存。
3.Thread类与线程的创建
一. 用三种定义方式:extends Thread,implements Runnable,匿名内部类
二.创建目标对象不包含对线程对象的引用(完全解耦)
当创建目标对象的类组合线程对象时,目标对象可以通过获得线程对象的引用(弱解耦)
4.线程的常用方法
1.start()
2.run()
3.sleep()
4.isAlive()
线程处于新建状态是,线程调用isAlive()方法返回false。当一个线程调用start()方法后,没进入死亡状态前调用isAlive返回true,当线程进入死亡状态后任可调用isAlive(),返回false。
5.currentThread()
currentThread() 是Thread类中的类方法,可以用类名直接调用,该方法返回当前正在使用CPU资源的线程。
6interrupt()
interrupt方法经常用来"吵醒"休眠的线程。
需要注意:一个已经运行的线程在没有进入死亡状态是,不要再给线程分配实体,由于线程只能引用最后分配的实体,先前的实体会变成“垃圾”,并且不会被垃圾收集器收集,垃圾实体仍然在工作
5.线程同步
Java程序中可以存在多个线程,但是在处理多线程问题时,必须注意这样一个问题:当两个或多个线程同时访问同一个变量,并且一些线程需要需要这个变量。程序应对这样的问题作出处理,否则会发生混乱。
所谓线程同步就是若干个线程使用synchronized修饰的方法,多个线程调用synchronized方法必须遵守同步机制。
6.协调同步的线程
多线程程序的应用,是为了提高程序性能和灵活性,为了让程序能并行的执行一些工作,比如一个线程负责将系统中的消息存入数据库,另一个线程负责接收消息;这就需要多个线程的协同工作---即线程间的通信。
当一个线程使用的同步方法中用到某个变量,而此变量有需要其他线程修改后才能符合奔县城的需要,那么可以再同步方法中用wait()、notify()和notifyAll()都是Object类中的final方法,被所有类继承并且不允许重写,特别需要注意的是,不可以在不同步的方法中使用.wait()、notify()和notifyAll()方法。
“监视线程”通讯模型:同时多个独立线程在运行,运行状态由第三方监控线程全程监控,这种模型为监视线程模型
生产者/消费者”模型:生产和消费线程共同操作一个集合,生产线程放入对象,消费线程取出对象!仅当集合中没有对象时,生产线程会放入一个对象,如有集合中有一个对象时,消费线程要马上取出这个对象。
- Java的多线程机制
- java多线程同步机制
- JAVA多线程机制1
- JAVA多线程机制
- Java多线程机制
- Java的多线程机制
- java开发多线程机制
- Java的多线程机制
- java多线程机制
- 《Java多线程机制 》
- Java多线程机制知识点
- Java多线程机制
- Java多线程通信机制
- JAVA多线程机制
- Java多线程通信机制
- Java的多线程机制
- Java的多线程机制
- java多线程同步机制
- Linux裸机下搭建各种服务(第一篇)
- U盘安装Ubuntu
- 重写滑动监听的 WebView
- navicate11下无法显示Mysql中的json列
- mssql 2008 R2清理数据库日志方法
- Java多线程机制
- 通用的Java hashCode重写方案
- pip install mysql-connector-python-rf 出现... not recognised解决方案
- Flume 读取实时更新的日志文件
- 通俗易懂的Websocket原理
- 移动平均法(Moving average,MA) 指数平滑法(Exponential Smoothing,ES)
- tensorflow(一)
- android 圆形按钮结合selector和shape实现
- 23种设计模式逐个代码举例分析