比如 下载好的播放器 播放器能播放视频 是因为它底层有很多写好的代码来支持 这就是程序
当打开播放器的时候 正在运行的那个程序 就是进程
看视频时 调整声音大小不会使视频停顿 相当于不同的小人在做事 一个播放视频 一个控制声音 这就是线程
比如 班级大扫除
扫除分配任务 在纸上列一个清单—->程序
开始扫除—->线程
每个同学负责自己的事 并发执行 互不影响—->线程
程序
可以理解为是一组静态代码
进程(一个进程有很多个小线程同时运行 由此产生多线程并发问题)
正在进行的程序 将静态的代码 运行起来
线程(是进程的最小组成单元)
正在执行程序中的小单元
1.主线程 系统线程
2.用户线程 main
3.守护线程(精灵线程) GC
线程——>操作系统级别的 CPU来控制 CPU分配时间碎片 才能让线程执行 不是我们说了算
如何在java中创建线程 让线程执行 多线程
掌握每一个线程的几种状态 及 状态之间的转换
new start() CPU分配 run() wait() exception over
创建线程————>就绪状态————>执行状态————>等待/挂起————>异常/消亡
| |
|_|
如果还能执行 就回到就绪状态
notify / notifyAll
实现线程的过程 方式1:
1.自己描述一个类
2.继承一个父类 Thread
3.重写run方法
4.new一个线程对象 调用start()方法 让线程进入就绪状态 等待CPU分配时间碎片后就可以执行了
例子:
public class RunningMan extends Thread{
private String name;
private RunningMan(){}
public RunningMan(String name){
this.name = name;
}
//重写run方法
public void run(){
for(int i = 0;i<=100;i++){
System.out.println(this.name+"跑到第"+i+"米了");
}
}
public static void main(String[] args){
RunningMan r1 = new RunningMan("苏炳添");
RunningMan r2 = new RunningMan("博尔特");
RunningMan r3 = new RunningMan("加特林");
//调用start方法(从Thread类中继承的) 让线程进入就绪状态
//如果直接调用run() 就不是多线程了 run是先让r1先执行一遍
//r2在执行一遍 再到r3 就是按顺序逐个执行
r1.start();
r2.start();
r3.start();
}
}
Java是单继承 如果一个类继承了其他类 同时又想继承Thread
实现线程的过程 方式2:
1.自己描述一个类
2.实现一个父接口 Runnable
3.重写run方法
4.new一个线程对象 创建一个Thread对象 将自己的对象包起来 以此来通过Thread对象调用start()方法
例子:
public class RunningMan implements Runnable{
private String name;
private RunningMan(){}
public RunningMan(String name){
this.name = name;
}
//重写run方法
public void run(){
for(int i = 0;i<=100;i++){
System.out.println(this.name+"跑到第"+i+"米了");
}
}
public static void main(String[] args){
RunningMan r1 = new RunningMan("苏炳添");
RunningMan r2 = new RunningMan("博尔特");
RunningMan r3 = new RunningMan("加特林");
//创建一个线程对象 可以将r1包起来 从而可以调用start方法
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
Thread t3 = new Thread(r3);
t1.start();
t2.start();
t3.start();
}
}