进程:是正在运行的数据
是系统进行资源分配和调用的独立单位
每一个进程都有它自己的内存和系统资源
线程:是进程中的单个顺序控制流,是一条执行路径
单线程:一个进程如果只有一条执行路径,则称为单线程程序
多线程:一个进程如果有多条执行路径,则称为多线程程序
实现多线程
1、继承Thread类、重写ran()方法
2、实现Runnable接口、重写run()方法
MyThread thread = new MyThread();//MyThread是自己定义的一个重写run的类
MyThread thread1 = new MyThread();
thread.run();//封装线程执行的代码,直接调用
thread1.start();//启动线程,然后由JVM调用此线程的run()方法
设置线程名
setName();
thread.setName("线程一");
带参构造方法:使用时要在类中添加构造方法
MyThread thread2 = new MyThread("线程三");
获取当前正在执行的线程对象的引用
System.out.println(Thread.currentThread());
线程调度模型
分时:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
抢占式:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的CPU的时间片相对多一些——javq使用抢占式
设置线程优先级以及获取线程优先级
MyThread thread1 = new MyThread("线程一");
MyThread thread2 = new MyThread("线程二");
thread1.setPriority(3);//设置线程优先级
int i1 = thread1.getPriority();//获取线程优先级
int i2 = thread2.getPriority();//获取线程优先级
System.out.println(i1+","+i2); thread1.start(); thread2.start();
注:线程优先级高只是代表着获取CPU时间片的概率高,并不是一定会首先执行
同步代码块
synchronized(对象){执行语句}:相当于给代码上锁,对象就是锁
同步方法
就是在返回类型前面添加一个关键字synchronized
同步静态方法的锁对象是 (类.class)——这是类的字节码文件对象
同步之后可以使用wait()等待以及notifyAll()唤醒其他线程
Lock锁
Lock是接口,不能直接实例化,可以使用ReentrantLock来实例化
lock:得到锁
unlock:解锁
可以使用try{ lock() } finally{ unlock() }的结构可以确保中间代码出现错误时依然释放锁