进程和线程
-
进程:是程序的一次执行过程,或者是正在运行的一个程序是一个动态的过程:有自己的产生、存在、和消亡的过程(生命周期)
进程作为资源分配的单位,系统在运行的时候会给每个进程分配不同的内存区域
-
线程:进程可以进一步细化成线程,是程序内部的一条执行路径 (安全问题)
线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器,线程切换开销小。
一个进程可以有多个线程
每个线程拥有自己独立的栈 程序计数器
## 并行和并发
-
并行 多个cpu 同时执行多个任务:比如多个人 同时 做不同的事 。
-
一个cpu 采用时间片 同时执行多个任务 比如秒杀 多个人做同一件事
线程的创建和使用
方式一 继承Thread 类的方式
- 创建一个继承Thread 类的子类
- 重写thread 的 run() --> 将此线程的执行操作 声明 在 run()中
- 创建Thread 类的 子类的对象
- 通过此对象 的调用 start (): 1.启动当前线程 2.调用当前线程的run()
//1.创建一个继承Thread 类的子类
public class MyThread extends Thread{
@Override
/*
*2. 重写thread 的 run() --> 将此线程的执行操作 声明 在 run()中
*/
public void run(){
int t = 100;
for(int i = 0;i <= t;i++){
if(i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ":"+i);
}
}
}
//3. 创建Thread 类的 子类的对象
MyThread t1 = new MyThread();
t1.setName("线程1");
//4. 通过此对象 的调用 start (): 1.启动当前线程 2.调用当前线程的run()
t1.start();
方式二 实现runnable 接口的方式
- 创建一个实现Runnable 的类
- 实现类去实现Runnable中的抽象方法()
- 创建实现类的对象
- 将次对象作为参数传递到Thread的构造器中,创建Thread 类的对象
- 通过thread 类对象调用 start()
//1. 创建一个实现Runnable 的类
public class Window implements Runnable {
@Override
/*2. 实现类去实现Runnable中的抽象方法()*/
public void run(){
int t = 100;
for(int i = 0;i <= t;i++){
if(i % 2 != 0){
System.out.println(Thread.currentThread().getName() + ":"+i);
}
}
}
}
//3. 创建实现类的对象
Window window =new Window();
//4. 将次对象作为参数传递到Thread的构造器中,创建Thread 类的对象
Thread w5 = new Thread(window);
//5. 通过thread 类对象调用 start()
w5.start();
两种方式的对比
开发中 优先选择 runnable 接口
- 实现的方式没有类的单继承性的局限性
- 实现的方式更适合来处理多个线程的共享数据
联系 :public class Thread implements Runnable
相同点:两种方式 都需要重写 run()方法,将线程要执行的逻辑声明在 run () 中
目前 两种方式 ,想要启动线程 ,都是调用 Thread 类的Start()
线程中常用的方法:
thread.start()
Thread.run()
Thread.currentThread() //静态方法 返回执行当前的代码
getName()
setName()
yield() //释放cpu的执行权
jion() //在线程 a 中 调 线程b,此时线程a进入阻塞状态 直到线程b运行完成 a 才从阻塞状态出来
stop()
sleep(long millitime) //让当前线程睡眠 指定的毫秒数 在指定的时间内 ,当前的线程是阻塞状态
isAlive() // 判断 线程是否存活
线程的通信:
线程中优先级的调用
调度策略
- 时间片
- 抢占式:高优先级的线程抢占CPU
Java 的调度方法
-
同优先级 线程 组成 先进先出 队列 ,时间片 策略
-
对高优先级 ,使用优先调度的策略
线程的优先级
MAX_PRIORITY:10
MIN_PRIORITY:1
NORMAL_PRIORITY:5
涉及 的方法
getPriority()
setProiority(int newProiority)
说明
- 线程创建时继承父线程的优先级
- 低优先级只是调度的概率低 ,并非一定时在高优先级之后才被调用