进程和线程
线程是比进程更小的执行单位,一个进程在执行过程中,可产生多个线程
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();//启动线程
}
}
【未完待续……】