程序
为完成特定的任务,用某种语言编写的一组指令的集合即一段静态的代码,静态对象
进程
程序的一次执行过程,或是在运行的一个程序是一个动态的过程:有它自身的产生、存在和消亡的过程——生命周期
程序是静态的,进程‘是动态的
进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域
线程
进程可进一步细化为线程,是一个程序内部的一条执行路线
若一个进程同一时间并行执行多个线程,就是支持多线程
线程作为调度和执行的单位,每个线程拥有独立运行的栈和程序计数器线程切换的、开销小
一个进程中的多个线程共享相同的内存空间/内存地址空间->他们从同一堆中分配对象,可以访问相同的变量和对象。这就是进程间通信更简单、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患
单核CPU和多核CPU
单核CPU其实是一种假的多线程因为在一个时间‘单元内,也只能执行一个线程的任务,多核CPU才能更好的发挥多线程的效率
并行和并发
并行:多个CPU同时执行多个任务
并发:一个CPU(采用时间片)同时执行多个任务
多线程的创建
方式一(继承与Thread类)
1.创建一个继承与Thread类的子类
2.重新Thread类的子类run() -->将此线程的‘执行操作声明在run中
3.创建Thread类的子类对象
4.通过此对象调用start();(1.启动当前线程,2调用当前线程的run)
package com.blb.com;
class MyThread extends Thread{
public void run()
{
for(int i=0;i<100;i++)
{
System.out.println(1111);
}
}
}
public class One {
public static void main(String[] args) {
myt myt=new myt();
myt.start();、、不能通过run方法调用线程
for(int i=0;i<10;i++)
{
System.out.println("-------");
}
}
}
常用方法
start():启动当前线程,调用当前进程的run()
run():通常需要重写Thread类中的方法,将创建的线程要执行的操作声明在、此方法中
currentThread():静态方法,返回执行当前代码的线程
getName():获取当前线程的名字
setName();设置当前线程的名字
yield():释放当前CPU的执行权
join():在线程b中调用线程a的Join(),此时线程b进入阻塞状态,直到线程a执行完毕,线程b才结束阻塞状态
sleep(long long t):让当前线程睡眠t毫秒,在指定的t毫秒内当前线程处于阻塞状态
isAilve():判断当前线程是否存活
调度策略
- 时间片
- 抢占式:优先级高的CPU抢占优先级
java调度方法
同优先级线程组成先进先出队列(先到先服务),使用时间片
对于搞优先级,使用优先调度的抢占式策略
线程优先级
MAX_PRIORITY:10
MIN_PRIORITY: 1
NORM_PRIORITY:5 ---->默认优先级
如何获取和设置当前进程的优先级
getPriority() :获取当前线程的优先级
setPriority(int p):设置当前线程的优先级
说明:高优先级的线程要抢占低优先级线程CPU的执行权。但只是从概率上讲,高优先级的线程高概率的情况下被执行。并不意味着只有高优先级的线程执行完以后,低优先级的线程才执行
创建多线程方式二
创建一个实现Runnable接口的类
实现类去实现Runnbale中的抽象方法:run()
创建实现类的对象
将此对象作为参数传递到Thread类中的构造器,创建Thread类的对象
通过Thread类调用run()方法()(调用当前线程,调用当前线程的run())
两种方式的比较
开发中优先选择实现Runnable接口的方式
原因:1实现的方式没有类的单继承性的局限性
2.实现的方式更合适来出来多个线程有共享数据的情况