程序: 一段静态的代码
进程:正在执行的程序 就是系统会自动分配内存空间和资源
进程的特点: 独立性 动态性 并发性
问:PPT和VNC可以同时执行么?
答:其实是不能的 看似同时运行的,其实不是的,只是只有一个程序在CPU上运行。
并行和并发
并行:程序在同一个时间点上运行
并发: 程序在同时(时间段)执行(java程序是并发的)
进程内部的一个执行单元 他是程序中单一的顺序控制流程,线程又称为轻量级的进程
如果在一个进程中同时运行了多个线程 用来完成不同的工作则成为多线程
线程的特点: 轻量级进程 独立调度的基本单位 可以并发执行
共享进程中的资源
线程 :程序的同一条执行路径
单线程 :程序只有一条执行路径
多线程 :程序有多条执行路径
问:多线程有什么作用?可能提高速度么?
多线程不能提高执行速度,当一个程序有多条执行路径(多线程) 那么这个程序有更多的机会抢占CPU。
启动多个线程 执行结果不一定相同。原因:线程具有随机性。
run方法是线程的一个启动 jvm会自动调用。认为调用run方法就相当于调用普通方法。
start方法是启动线程的方法,调用后jvm会自动调用run方法。
两种创建线程的区别:
A继承 Thread 类
优点 : 编程简单
缺点 : 已经继承THread 类 无法继承其他类
B 实现 Runable 接口
优点:可以继承其他的类 最主要的原因是 多线程可以共享同一个资源
缺点 :编程稍微复杂
****Java 是多线程 一般来说都有两个线程 main线程 gc 线程 *******************
线程
线程的生命周期
创建 就绪 运行 终止 阻塞
创建:用 new 关键字 创建对象 Thread th=new Thread();
就绪: 有执行资格没有执行权
运行:有执行资格也有执行权
终止:运行完 线程中run方法 当没有执行完run方法 那就重新回到 就绪状态
阻塞: 当运行状态的线程调用wait() suspend() sleep()方法 就到了 阻塞状态
当我们再次调用notify()方法的时候就再次回到就绪状态
Java 提供了一个线程调度器来监控启动后进入就绪状态的所有线程 按照优先级决定调度哪个线程优先执行
Join () 阻塞指定(别人)线程等到另一个线程完成以后再继续执行。 加到哪里 阻塞哪里
Sleep() 让自己线程停止运行一段时间 将处于阻塞状态
如果调用了 sleep 方法 没有其他等待的状态,当前线程也不会马上恢复。
Yield() 让当前正在执行的线程暂停 不是阻塞线程 而是将线程转入就绪状态
如果调用yield 方法之后 没有等待其他线程 当前线程会马上恢复执行。
SetDaemon() 后台线程 会 随线程结束而结束
注意点:当线程A设置为守护线程,其他线程执行完毕,线程A还未执行完毕,则线程A终止执行。
终止线程的方法
设置标识符 让run 方法正常执行完
调用stop 可以终止当前的线程 此方法一般不会使用 因为强制终止线程 会导致 run 方法里面部分的方法不能被调用
使用interrupt 中断线程 只能中断正在休眠的线程或者调用
Interrupt 方法的线程
子线程执行了InterruptedException
如 sleep() join() wait()
加入synchronized(this){}的作用就是为了让不同的线程不能一起进入代码块 只能有一个线程进入代码块里面。 不加入synchronized 的就可以多个线程都进入。
线程同步的特点:
优点:安全
缺点:降低了效率
同步代码块以及同步方法都可以解决线程同步的问题。
注意点: 在方法生命的时候 加一个关键字 sychonized , sychonized 尽量不要加在run方法上。