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()方法。

  “监视线程”通讯模型:同时多个独立线程在运行,运行状态由第三方监控线程全程监控,这种模型为监视线程模型

  生产者/消费者”模型:生产和消费线程共同操作一个集合,生产线程放入对象,消费线程取出对象!仅当集合中没有对象时,生产线程会放入一个对象,如有集合中有一个对象时,消费线程要马上取出这个对象。




原创粉丝点击