进程和线程

线程是比进程更小的执行单位,一个进程在执行过程中,可产生多个线程


Java多线程

在java中,多线程给人同时执行多个事件的错觉,实际上计算机任何时刻始终只执行其中一个

“同步执行“实际上是利用了java虚拟机(JVM)快速切换线程,使得线程被轮流执行

每个Java应用程序都有一个缺省的主线程,当JVM加载代码时,发现main方法则启动主线程,在执行main方法时再创建的线程则称为其他线程,当所有线程都执行结束之后,JVM会结束应用程序

用Thread类及其子类对象来表示线程

1. 生命周期中线程的状态:

  • 新建
    被声明创建时,有了相应的内存空间和其他资源,调用start()方法通知JVM新线程正在排队等候
  • 运行
    JVM将CPU使用权切换到该线程时,则脱离主线程,独立开始自己的生命周期,此时立刻执行该类的run()方法【run方法规定了线程的具体使命,所以必须在子类中重写run方法】
  • 中断
  • JVM切换线程,本线程让出使用权
  • 执行了sleep(int millsecond)方法【立刻让出使用权,等待millsecond指定毫秒数后重新排队等待,从中断处继续运行】
  • 执行了wait()方法【进入等待状态,当其他线程调用notify()方法通知它时,重新排队,从中断处继续运行】
  • 执行某个操作进入阻塞状态【当阻塞消除后,重新排队,从中断处继续运行】
  • 死亡 即释放了实体(内存)
  • 完成了全部工作,不具有继续运行的能力
  • 被提前强制性终止

2. 调度和优先级(不提倡使用优先级保证算法正确执行)

当线程排队时,JVM中调度器负责管理线程,优先级分为10级,用Thread类中的类常量表示

优先级可以通过setPriority(int grade)调整,没有明确设置时,优先级都为5


创建线程

1.使用Thread类的子类创建线程【优点是:可以在子类中增加成员变量,增加方法,使线程具有某种功能。】

public class XXXX extends Thread//Thread类的子类
{
    public void run(){ //必须重写run方法
        ......
    }
}

public class ex1{
    public static void main(String args[]){
    XXXX xxx; //声明对象
    xxx = new XXXX();//创建线程
    xxx.start();//启动线程
    }
}

2.使用Thread类创建线程【使用构造方法Thread(Runnable target)】

public class XXXX implements Runnable//实现Runnable接口
{
......
}

public class ex2{
    public static void main(String args[]){
    Thread xxx;//声明线程
    XXXX x;//声明对象
    x = new XXXX();//创建目标对象x
    xxx = new Thread(x);//创建目标对象是x的线程
    xxx.start();//启动线程
    }
}

【未完待续……】