一、Java多线程机制
1、java的多线程机制 Java虚拟机快速地把控制从一个线程切换到另一个线程。每个应用程序都有一个缺省的线程。 2、线程的状态和生命周期 线程的一个完整的生命周期主要经历如下四个状态: (1)、新建 (2)、运行:线程必须调用start()方法通知JVM,这样JVM就会知道又有一个新的线程排队等候切换了 (3)、中断:有四种中断方式 JVM将CPU资源从当前线程切换到其他线程 线程调用sleep(int millsecond)方法 线程执行wait()方法 线程执行某个操作进入阻塞状态 (4)、死亡 3、线程调度与优先级 JVM中的线程调度器负责管理线程,调度器把线程的优先级分为10个级别,Java调度器的任务是使高优先级的线程能始终运行,一旦时间片空闲,则使其有相同优先级的线程 以轮流的方式顺序使用时间片。
二、Thread类实现多线程 1、Thread的子类创建线程 在Java语言中,用Thread类或者子类创建线程对象。 在编写Thread类的子类时,需要重写父类的run()方法,目的是规定线程的具体操作,否则线程什么也不做,因为父类的run()方法中没有任何操作语句。
三、Runnable接口实现多线程 1、使用Thread子类创建线程的优点:可以在子类中增加新的成员变量,也可以增加新的方法。 但是Java不支持多继承,Thread类的子类不能再扩展其他的类 2、Runnable 接口与目标对象 创建线程的另一个途径就是使用Thread类直接创建线程对象,使用Thread创建线程通常的构造方法:Thread (Runnable target); 在创建线程对象时必须向构造方法的参数传递一个实现Runnable接口类的实例,该实例对象称作所创建线程的目标对象,当线程 调用start()方法后,一旦轮到它来享用CPU资源,目标对象就会自动调用接口中的run方法。
3、实现Runnable和继承Thread的区别 (1)、一个类只能继承一个父类,存在局限;一个类可以实现多个接口 (2)、在实现Runnable接口的时候调用Thread(Runnable target)创建线程时,使用同一个Runnable实例,则建立的多线程的实例变量 也是共享的,但是通过Thread类是不能用一个实例建立多个线程,故而实现Runnable接口适合于资源共享。当然,继承Thread类 也能共享变量,能共享Thread类的static变量。 (3)、Runnable接口和Thread之间的联系 public class Thread extends Object implements Runnable 可以看出Thread类也是Runnable接口的子类。
四、线程常用方法和线程同步 1、线程的常用方法 (1)、start():线程调用该方法将启动线程 (2)、run():用来定义线程对象被调度之后所执行的操作 (3)、sleep(int millsecond); 优先级高的线程可以在他的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间 (4)、isAlive():在线程的run()方法结束之前,即没有进入死亡状态之前,线程调用isAlive()返回true。 (5)、currentThread():该方法是Thread类中的类方法,可以用类名调用,该方法返回当前正在使用CPU资源的线程。 (6)、interrupt():一个占有CPU资源的线程可以让休眠的线程调用interrupt()方法“吵醒”自己,即导致休眠的线程发生InterruptedException异常,从而结束休眠,重新排队等待CPU资源。
2、线程同步 所谓线程同步就是若干个线程都需要使用一个synchronized修饰的方法,即程序中的若干线程都使用一个方法,这个方法用synchronized给予了修饰。 多个线程调用synchronized方法必须遵守同步机制:当一个线程使用这个方法时,其他线程想使用这个方法时必须等待,直到线程使用完该方法。在使用多线程解决许多实际问题时,可能要把某些 修改数据的方法用关键字synchronized来修饰。