程序,进程,线程
程序:是一个指令序列,静止的。
进程:执行的程序被称为进程,是动态的,单核CPU在任何时间点上只能运行一个程序。宏观并行,围观串行。
线程:又称为轻量级线程。进程有多个线程组成,彼此间完成不同的任务,交替执行,成为多线程。
线程的组成部分
CPU时间片:操作系统(os)为每一个线程分配执行时间
运行数据:
堆空间:存储线程需要使用的对象,多个线程可以共享堆中的对象
栈空间:存储线程需要使用的局部变量,每个线程都有独立的栈。
线程的特点
线程的执行是抢占式的,多个线程在同一个进程中可以并发执行,其实就是CPU快速的在不同的线程之间切换。
八个字概括:并发执行,轮转交替。
小结
一个程序运行后,至少有一个进程。
进程是程序的一个动态过程,它指的是从代码加载到执行完毕的一个完成过程。
一个进程可以包含多个线程,但是至少需要有一个线程,否则这个进程是没有意义的。
进程间不能共享资源,但线程之间可以。
线程创建的方式
继承Thread类
示例:
public class TestCreateThread { public static void main(String[] args) { MyThread my = new MyThread(); my.start(); } } class MyThread extends Thread{ public void run(){ for (int i = 0; i < 50; i++) { System.out.println("MyThread:"+i); } } }
步骤总结
继承Thread类
覆盖run方法
创建子类对象
调用start方法
实现Runnable接口
示例:
public class TestCreateThread { public static void main(String[] args) { MyRunnable mr = new MyRunnable(); Thread t2 = new Thread(mr); t2.start(); } } class MyRunnable implements Runnable{ @Override public void run() { for (int i = 0; i <= 50; i++) { System.out.println(i); } } }
步骤总结
实现Runnable接口
覆盖run()方法
创建实现类对象
创建线程对象
调用start() 方法
小结
> 两种方式比较,用实现的方式更好,原因:
>
> a. 可以满足不同线程操作同一任务。即传递同一个实现类对象
>
> b. 继承的资源稀缺只能一次,因此能用实现解决的避免用继承。
常用的方法
1. 休眠:
public static void sleep(long millis)
//当前线程主动休眠millis毫秒
2. 放弃:
public static void yield()
//当前线程主动放弃时间片,回到就绪状态,竞争下一次时间片
3. 结合:
public final void join()
//允许其他线程加入到当前线程中,并优先执行
生命周期
对于线程,当线程被创建并启动之后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。
在线程的 生命周期中,他会经历各种不同的状态【在一个进程中,多个线程同时运行,是在争抢CPU时间片】
New(新生):线程被实例化。
Ready(就绪状态):start()后,该线程对象处于的状态。等待CUP分配资源的过程中....
Running(运行):抢到了时间片,CPU开始处理这个线程中的任务
TimedWaiting(限期等待): 休眠时,会进入限期等待,等待休眠时间到。
Waiting(无限等待):wait()后,进入的状态。该线程必须等待有另一个线程唤醒才能到就绪状态。
Terminated(死亡):线程终止 a.run方法执行完成,线程正常结束【正常的死亡】