并发处理:用户使用一个软件时,它可以执行多种任务;
进程:正在执行的程序。在程序投入运行时,系统从程序入口开始按语句的顺序(顺序、分支和循环)完成相应的指令指直接薇,从出口退出,同时整个程序结束。
线程:比进程更小的执行单位,程序的顺序控制流,在形式上同进程很相似,也是用一个顺序执行的语句来实现特定的功能。
注:线程不能独立运行,必须依赖与某一个进程之中,有进程触发才能执行;
不同进程的内部数据和状态都是完全独立的,而多线程是共享一块内存空间和一组系统资源,也就意味着他们可以访问相同的变量和对象,有可能互相影响;
与进程相比,线程本身的数据通常只有寄存器数据,以及一个程序执行时使用的堆栈,所以线程的切换比进程切换的负担药效。
主线程:每一个Java应用都至少有一个“主线程”。当一个Java程序启动时,Java虚拟机(JVM)会创建主线程,并在主线程中调用程序的main方法。
JVM 还创建了其他线程,如与垃圾收集、对象终止和其他JVM内部处理任务相关的线程。
其他工具也可以创建线程,如AWT,
Thread类
Java语言中允许多个线程同时执行,这些线程实际上就是java.lang.Thread 类,或子类的对象
用Thread类实现线程,必须通过定义run()线程提的方法来执行该线程的任务;
线程的优先权和线程调度
线程的优先权:线程对象在执行中的优先顺序;是定义在java.lang.Thread中的静态常量;用数字1~10表示
默认的优先权 NORM_PRIORITY,对应值为5
设置线程优先权:setPriority()
获取线程优先权:getPriority()
Java虚拟机采用抢占调度方式来分配CPU时间。即Java通过线程调度来监视程序启动所有的线程。线程调度器根据可运行线程池中各个可运行线程的优先权来调度线程,分配线程的CPU时间片。现成的优先权对应的数值越高,获取CPU时间片就越多,执行的优先权越高。优先级越低,说明线程获取的CPU时间片越少,获取的执行时间越短。如果有两个同优先权的线程等待CPU,调度者会任意选一个先运行。该被选的线程运行明知道下列情况为止
1 更高线程成为可运行的
2 它让位于其他线程,或它run方法终止
3 在一个支持时间片的系统中,它的时间段过期了,第二个线程才有机会运行
守护线程
守护线程也是一种线程,它主要为其他用户线程在后台提供服务支持,如JVM的垃圾回收、内存管理等线程都是守护线程,守护线程也可以由程序员自行创建,只需要在启动线程之前调用线程对象的setDaemon(true)方法,这个线程就可以是守护线程。守护线程的最大特点在于如果用户线程已经结束,在java虚拟机中只剩下守护线程的话,Java虚拟机会退出;
Runnable接口
实际上,Thread类就是实现了Runnable接口的类。在Runnable接口中之定义了一个方法即public void run();
Runnable接口的最大好处就是为非Thread子类提供实现线程的可能。
线程的生命周期
线程的四种状态:新建线程、可运行状态、线程不可运行状态、线程死亡状态,这四种状态发生在一个线程周期中;
1 新建线程状态 :创建和定义一个线程对象,并获得内存空间以及相应的资源
2 可运行状态:表示线程已经分配了相应的资源,处于具有可运行的能力的这种状态。有以下几种情况
对象调用start()方法后,该线程具有独立运行的能力。即它进入可运行池,等待线程调度其分配·CPU时间片。
线程对象从不可运行状态中,调用notify()唤醒监控对象等待的线程或notifyAll()唤醒监控对象等待的所有线程重新恢复为可运行状态,重新进入可运行池、
线程对象因为调用sleep()方法,进入休眠。一旦休眠限定的时间解读,它也会从不可运行的状态恢复
.