一,概念
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1或多个线程。(进程是正在运行的程序,是系统资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
线程和进程一样分为五个阶段:创建、就绪、运行、阻塞、终止。
多进程是指操作系统能同时运行多个任务(程序)。
多线程是指在同一程序中有多个顺序流在执行。
在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口.
(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用)
并发:物理上同时发生,指在同一时间点多个程序同时运行
并行:逻辑上同时发生,指在同一时间内多个程序同时运行
JAVA程序运行原理:由Java命令启动JVM, JVM启动就相当于启动了一个进程,
接着由该进程创建了主线程去调用main方法。。
二,Thread方法:
public static Thread currentThread() 获得当前线程
public String getName() 获得线程名字
public void setName(String name) 设置线程名字
public final int getPriority() 获得线程优先级,默认为5
public final setPriority(int newPriority) 设置线程优先级,值为1-10的int值 ,
否则报IllegalArgumentException(线程优先级高仅表示获得CPU几率高,长时间运行效果更明显)
线程控制方法:
public static void sleep(long millis) 线程休眠
public static void yield() 线程礼让(放弃CUP的执行权,线程从运行状态回到就绪态)
public final void join() 线程加入 线程a中run()方法中调用线程b的join()方法,线程a会阻塞至线程b执行完再进入就绪状态。
public final void setDaemon(boolean on) 后台线程
public final void stop()线程中断
public void interrupt() 线程中断
线程的生命周期:
Thread和Runnable的区别
如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
总结:
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
提醒一下大家:main方法其实也是一个线程。在java中所以的线程都是同时启动的,
至于什么时候,哪个先执行,完全看 谁先得到CPU的资源。
在java中,每次程序运行至少启动3个线程。一个是main线程,一个是垃圾收集线程,还有一个异常处理线程。
因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,
每一个JVM实习在就是在操作系统中启动了一个进程。
面试题:下面匿名内部类方式实现的线程,jvm会执行哪一个run()方法?
答案是会执行Thread的匿名内部类重写的run()方法,也就是输出 world!+i...
new Thread(new Runnable(){
public void run(){
for(int i=0;i<100;i++){
System.out.println("hello"+i);
}
}
} )
{
public void run(){
for(int i=0;i<100;i++){
System.out.println("world!"+i);
}
}
}.start();