进程:当一个应用程序进入内存运行,就是一个进程。
线程:线程是进程里的执行单元。进程内有多个线程的程序就是多线程程序。
常用Thread类的方法:
getName()
start()
run()
sleep() 抛出了异常。
Thread.currentThread()
Thread.currentThread().getName() //在那个线程中就获取当前线程的名称。
Thread线程表示
run()可以当做普通方法直接调用,这样不是多线程了。Thread通过start()方法开启新的线程。
多线程执行流程
多线程程序的内存图解: 堆内存共享,栈内存私有
线程优先级设置:
优先级范围:1-10(优先级从低到高),默认是5。
获取优先级:线程对象.getPriority();
设置优先级:线程对象.setPriority(9);
注意:优先级高的线程不一定每次都能抢的过优先级低的线程,只是抢到执行权的概率更高。
**守护线程:**执行一些辅助性操作
特点:当所有的非守护线程执行完毕,守护线程就终止,无论守护线程是否执行完毕。
线程对象.setDaemon(true);
线程同步:
当多个线程对共享的变量进行写操作时会出现问题。
买票案例的分析过程:(要明白为什么会存在三个线程卖出同一张票和卖出第-1张票的情况)
三种方式:
同步代码块 :synchronized(同步锁){ } 任意对象可以做为同步锁,通常使用this
弊端:当线程很多时,每个线程都会去同步判断锁,耗费资源,降低效 率。
同步方法 : 将synchronized加在方法上,普通方法以this为同步锁,静态方法以字 节码文件(类名.class)为同步锁。
lock接口 : Lock lock = new ReentrantLock();
? lock.lock();
? 代码;
? lock.unlock();
线程同步的原理:
线程的六种状态:
判断问题
被重写的方法没有抛出异常时,子类重写这个方法时不可抛出编译期异常,可以抛出运行期异常。
异常
被重写的方法没有抛出异常时,子类重写这个方法时不可抛出编译期异常,可以抛出运行期异常。
[外链图片转存中…(img-slNZk2WI-1705920958160)]
异常