线程知识点

线程:一个程序内部的一条执行路径
若一个进程同一时间并行执行多个线程,就是支持多线程的
线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序技术器(pc).线程切换的开销小
一个进程中的多个线程共享相同的内存单元/内存地址空间->它们从同一堆中分配对象,可以访问相同的变量和对象。
使进程间通信变得简便、高效。但多个线程操作共享的系统资源会带来安全隐患。

创建多线程的两种方式:
一:继承Thread的方式
1.创建一个继承于Thread类的子类
2.重写Thread类的run() -->将此线程执行的操作声明在run()中
3.创建Thread类的子类的对象
4.通过此对象调用start()

tips:启动线程必须调用start(),不能用run()启动线程
如果再启动一个线程,必须重新创建Thread子类的对象,再重新调用start方法

二:实现Runnable的方式
1.创建一个实现了Runnable接口的类
2.实现类去实现Runnable中的抽象方法:run()
3.创建实现类的对象
4.将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
5.通过Thread类的对象调用start()

两种方式对比:
开发中:优先选择实现Runnable接口的方式
原因:1.实现的方式没类的单继承性的局限性
2.实现的方式更适合来处理多个线程共享数据的情况

联系:public class Thread implements Runnable
相同点:两种方式都要重写run(),将线程要执行的逻辑声明在run()中
目前两种方式,启动线程、都是调用Thread中的start()

Thread类中常用方法:
1.start():启动当前线程,调用当前线程的run()
2.run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中
3.currentThread():静态方法,返回执行当前代码的线程
4.getName():获取当前线程的名字
5.setName():设置当前线程的名字
6.yield():释放当前cpu的执行权
7.join():在线程a中调用线程b的join(),此时线程a就进入阻塞状态,直到线程b完全执行完后,线程a才结束阻塞状态
8.stop():已过时,当执行此方法时,强制结束当前线程
9.sleep(long millitime):让当前线程“睡眠”指定的millitime毫秒。在指定的millitime毫秒时间内,当前线程是阻塞状态
10.isAlive():判断当前线程是否存活

线程的优先级:
1.
MAX_PRIORITY:10
MIN_PRIORITY:1
NORM_PRIORITY:5 -->默认优先级

2.如何获取和设置当前线程的优先级:
getPriority:获取线程的优先级
setPriority(int p):设置线程的优先级

说明:高优先级的线程要抢占低优先级线程cpu的执行权。但只是从概率上,高优先级的线程高概率被执行。并不意味着只有当高优先级的线程执行完后,低优先级的线程才执行

线程通信:wait()/notify()/notifyall() 此三个方法定义在Object类中


线程的生命周期
新建:当一个Thread类或其子类被声明并创建时,新生的线程处于新建状态
就绪:新建线程被start()后,进入线程队列等待CPU时间片,具备运行条件但未分配到CPU资源
运行:当就绪的线程被调度获得CPU资源时,进入运行状态,run()方法定义了线程的操作和功能
阻塞:被人为挂起或执行输入输出操作时,让出CPU并临时中断执行,进入阻塞
死亡:线程完成全部工作或被提前强制中止或出现异常导致结束

posted @ 2020-10-10 22:21  Jazzmatic  阅读(89)  评论(0编辑  收藏  举报