要理解多线程的概念,先给大家说说进程、线程的概念:
进程:正在运行中的应用程序;
线程:包含在进程下的一个执行过程。
单线程:串行程序--特点:按照顺序执行
多线程:并行程序(cpu在多个线程间不断切换,使用户感觉这几个线程是同时进行)
Main方法本身运行的时候就开启了一条线程
如果想创建其他线程——四个办法:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
4.实现线程池
共同特点:必须重写run方法(线程运行入口)
启动线程的方式不是调用run方法,需要调用start方法
获取线程名字:getName()方法
获取main线程名字:Thread.currentThread().getName()(先获取当前线程对象)
设置线程名字:setName()方法
线程执行后想要出让资源(不一定抢不到):yield()
线程执行后放弃多长时间抢占权:sleep(毫秒数)(不一定睡眠时间到了就能立即执行)
Cpu调度不是按照方法来调度的
Runnable my=new MyThread();(实现接口)
Thread t1=new Thread(my);
锁————synchronize(防止别人使用某些资源)加在代码块、方法(锁的对象默认用的是this)上
具备原子性——不可分割
并行转串行
一定相同对象才生效
Wait()线程等待,前提:使用wait必须在synchronize中,并且调用wait的对象必须是锁对象
Notify()唤醒在等待队列中的随机的一个线程
线程死锁——线程全部进入等待状态,等待别人唤醒
解决死锁的方式:
1.wait(传递等待时间)
2.notifyAll()唤醒等待队列中所有的线程
Wait和sleep都是线程等待
Wait必须在synchronize中 是通过object调用
Sleep是Thread的方法
Sleep释放cpu的抢占权 但不释放锁的占用权
Wait即释放了cpu抢占权 也释放了锁
Sleep是时间到了自动唤醒
Wait可以通过时间,也可以通过其他线程唤醒