java中的线程
java中的线程
一、基本认识
1、简介
线程是程序运行的基本单位。进程是由线程不断快速切换得到。线程Thread是具有一定顺序的指令序列、存放方法中定义局部变量的栈和一些共享数据。一个程序中有多个线程在同时执行。
2、创建线程
(1)
创建一个新的线程类,继承Thread并且重写run方法
public xxx extends Thread{
public void run(){
}
}
Thread x=new ThreadType();
x.start();
(2)Runnable接口创建线程
class Thread implements Runnable{
public void run(){}
}
3、线程周期
(1)创建: start启动,stop停止
(2)可运行:需要考虑优先级和调度
(3)不可运行:wait阻塞,notify和notifyAll恢复可执行状态
(4)退出
4、线程状态转换
(1)notify仅仅唤醒一个线程并允许它获得锁
(2)notifyAll唤醒所有等待这个对象的线程,并允许它们获得锁
(3)sleep(millis):millis毫秒后进入可执行状态
(4)wait:线程进入不可执行状态
(5)isAlive:判断一个线程是否存活。当线程处于可执行状态或不可执行状态时返回true,当线程处于创建状态或者退出状态时返回false
(6)join:等待该线程终止的时间最长毫秒数
5、线程调度
(1)简介
多线程交替抢占CPU,优先级高的线程占用的时间多,高优先级的线程执行的效率会高些,执行速度也会快些。
(2)setPriority设置线程的优先级,1—10之间,windows只支持3个优先级,ThreadMAX_PRIORITY\ThreadMIN_PRIORITY\ThreadNORM_PRIORITY
(3)getPriority获得当前线程的优先级
二、线程同步
1、简介
线程同步机制让多个线程有序地访问共享资源,实现共享数据的一致性。
2、同步synchonized
synchonized(obj){}
对于这样一个同步块,synchornized获取对象锁,通过一个obj对象单独被一个线程使用,保证不会无obj对象的线程无法进行而保证了线程的同步。
3、死锁状态
4、程序运行原理
(1)分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
(2)抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
5、抢占式调度详解
多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
6、多线程的内存图解
(1)多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所属的栈内存空间,进行方法的压栈和弹栈。
(2)当执行线程的任务结束了,线程自动在栈内存中释放了。
7、常用方法
(1)Thread.currentThread()----获取当前线程对象
(2)Thread.currentThread().getName()----获取当前线程对象的名称
(3)Lock接口
lock()-----获取锁
unlock()----释放锁