一.线程和进程的概念:
线程:线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
进程:进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。
一个进程包含一个线程或者多个线程。
二:实现线程的方法:
1.继承Thread类
public class StartThread extends Thread{
@Override
public void run() {
for(int i=0;i<20;i++) {
System.out.println("一边听歌");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建子类方法
StartThread st=new StartThread();
//启动
st.start();
for(int i=0;i<20;i++) {
System.out.println("一边coding");
}
}
}
2.实现Runnable接口
推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口
public class StartRun implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<20;i++) {
System.out.println("一边唱歌");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//创建实体类对象
StartRun sr=new StartRun();
//创建代理类对象
Thread t=new Thread(sr);
t.start();
for(int i=0;i<20;i++) {
System.out.println("一边coding");
}
}
}
3.通过 Callable 和 Future 创建线程(了解即可)
三:线程的生命周期:
新建状态:
线程对象创建完成之后,即进入新建状态。
就绪状态:
当线程对象调用了start()方法后,进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。并不是调用了start()方法就立即执行。
运行状态:
如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:
处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才有机会再次被CPU调用以进入到运行状态。
1.等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状。
2.同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
3.其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:
一 个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。