多线程与多进程
多线程的创建
常用方法
- void start():启动线程,执行run()
- run():线程启动后执行
- String getName():返回线程名称
- void setName(String name):设置该线程名称
- static Thread currentThread():返回当前线程。在Thread子类中就是this,通常用于主线程和Runnable实现类
- static void yield():线程让步。其实就是
线程异步
- join():线程并发堵塞
- static void sleep(long millis):指定单位为ms,让线程在指定时间内交出CPU控制权,时间到后才获得CPU控制权。
类似于python中的await
- stop():不保留任何未处理数据的强制关停线程
- boolean isAlive():bool判断线程是否存活
方式一:继承于Thread类
- 创建一个继承于Thread类的子类
- 重写Thread类的run()
- 创建Thread类的子类的对象
- 通过此对象调用start()
class MyThread extends Thread{
@Override
public void run(){
System.out.println("多线程run成功");
}
}
class TreadTest{
public static void main(String[] args){
MyThread t1 = new MyThread();
t1.start();
}
}
方式二:实现Runnable接口
- 定义子类,实现Runnable接口。
- 子类中重写Runnable接口中的run方法。
- 通过Thread类含参构造器创建线程对象。
- 将Runnable接口的子类对象作为实际参数传递给Thread类的构造器中。
- 调用Thread类的start方法:开启线程,调用Runnable子类接口的run方法。
区别
继承Thread |
实现Runnable |
线程代码存放Thread子类run方法中 |
线程代码存在接口的子类的run方法 |
实现方式的好处
- 避免了单继承的局限性
- 多个线程可以共享同一个接口实现类的对象,非常适合多个相同线 程来处理同一份资源。
线程优先级
调度策略
- 时间片:“拉链图式”
- 抢占式:优先级高的线程,优先获得cpu的控制权
Java的调度方法
- 同优先级默认组成队列,使用时间片策略
- 对高优先级,优先使用抢占式
优先级等级
MAX_PRIORITY<