多线程第一遍记录
线程的启动
如何使线程暂停
如何使线程停止
线程的优先级
线程安全相关问题
Thread也实现了Runnable接口、
currentThread isalive sleep getid
Thread.stop是不安全的,释放该线程所持有的所有的锁。一般任何进行加锁的代码块,都是为了保护数据的一致性,如果在调用thread.stop()后导致了该线程所持有的所有锁的突然释放,那么被保护数据就有可能呈现不一致性,其他线程在使用这些被破坏的数据时,有可能导致一些很奇怪的应用程序错误。
正常退出,stop退出,interrupt退出
yield方法的作用是放弃当前的cpu资源,将它让给其他的任务去占用cpu执行时间,但放弃的时间不确定,有可能刚刚放弃,马上又获得cpu时间片
setPriority设置线程优先级,如果小于1或大于10,,则jdk抛出异常throw new illegalArgumentException,线程的优先级具有继承性,如果A线程继承B线程,则B线程的优先级与A是一样的,高优先级线程总是大部分先执行完,但不代表高优先级的线程全部先执行完
守护线程和非守护线程,进程中不存在非守护线程,则守护线程自动销毁
“可重入锁”:自己可以再次获取自己的内部锁
当一个线程执行的代码出现异常时,其所持有的锁会自动释放
当多个线程同时执行synchronized(x){}同步代码块时呈同步效果,当其他线程执行x对象中synchronized同步时呈同步效果,当其他线程执行X对象方法里面的synchronized(this)代码块也呈现同步效果
通过使用volatile关键字,强制的从公共内存中读取变量的值,保证了可见性,不能保证原子性
wait方法时Object类方法,在执行notify方法后,当前线程不会马上释放该对象锁,呈wait状态的线程也并不能马上获取该对象锁,要等到执行notify方法的线程讲程序执行完,也就是退出synchronized代码块后,当前线程才会释放锁,而呈wait状态所在的线程才可以获取该对象锁,当方法wait被执行后,锁被自动释放,但是执行完notify方法,锁却不自动释放
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将遭遇子线程结束之前结束,这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要缺德这个数据中的值,就要用到join方法了,方法join的作用是等待线程对象销毁,方法join的作用是使所属线程对象正常执行run方法中的任务,而使当前线程z进行无限期的阻塞,等待线程x销毁后再仅需执行线程z后面的代码,join的功能在内部是使用wait方法实现的,所以join方法具有释放锁的特点
类Threadlocal解决的是变量在不同线程间的隔离性,也就是不同线程拥有自己的值,不同线程中的值是可以放入Threadlocal类中进行保存的
使用InheritableThreadlocal类可以让子线程从父线程取得值
在使用notify、notifyAll方法进行通知时,被通知的线程却是由jvm随机选择的,但是使用ReentrantLOck结合Condition类是可以实现前面介绍过的“选择性通知”,一个lock对象里面可以创建多个Condition实例,线程对象可以注册在指定的Condition中,从而有选择性地进行线程通知,在线程调度上更加灵活,调用Condition对象的await方法,使当前执行任务的线程进入例如等待WAITING状态Condition.signal() 通知前需要先持有锁,通知后解锁。如果不解锁,则被通知的线程虽然被通知到了,但是无法获得锁。 java lock.lock(); condition.signal(); lock.unlock();
Object类中的wait方法相当于Condition类中的await方法,Object类中的wait(long timeout)方法相当于Condition类中的await(long time,TimeUnit unit)方法,Object类中的notify方法相当于Condition类中的signal方法,Object类中的notifyAll方法相当于Condition类中的signalAll()方法
锁lock分为公平锁与非公平锁,公平锁标识线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的fifo先进先出的顺序,而非公平锁就是一种获取锁的抢占机制,是随机获得锁的,和公平锁不一样的就是先来的不一定先得到锁,这个方式可能造成某些线程一直拿不到锁,结果也就是不公平的了
使用多线程技术时,代码的运行结果和代码执行顺序或者调用顺序无关
线程有六个状态:NEW Thread被创建,但start方法没有被调用,RUNNABLE 线程正在运行或在操作系统调度它时可运行,BLOCKED 线程被阻塞,等待获取锁,WAITING 线程调用object的wait方法或者Thread的join方法而没有运行,TIMED_WAITING 线程调用Thread类的sleep方法 或加一定延时调用object的wait方法或者Thread的join方法,TERMINATED 线程run方法正常或者抛出异常结束
(1)不能对一个线程多次调用start方法,因为如果一个线程已经被调用,状态已经改变,如果再次调用,由于不是原有状态就会抛出IllegalThreadStateException