Java 线程执行过程, 线程资源共享
2020-05-12 本文已影响0人
攻城狮托马斯
Interrupt(), isInterrupted()
在Sleep(), wait()等操作中, 如果线程被Interrupt,会抛出InterruptedException
InterruptedException会把interruptted标志位由True改为False, 因此,需要在catch(InterruptedException e)中, 手动interrupt();
这样的好处是,在手动Interrupt之前,可以释放当前线程持有的资源。
Run(), Start()
UseThread thread = new UseThread(); //新建一个线程Object
thread.start() //只能被调用一次,线程Object开始和运行挂钩
thread.run()//可以被调用多次, 线程开始运行
如果线程不start直接run, 那么用来执行run()这个任务的可能是其他的线程.
线程执行的全过程
Yield(): 让CPU让出线程的占有权, 从CPU中退出, 不一定会释放该线程持有的锁,因为线程可能不持有锁
(yield();)
Join(): A.join(), 让主线程先wait()挂起, 等执行完A线程的时候再继续执行. 底层以wait()实现, 释放主线程自身的锁.
Join还可以保证任务按顺序执行,只有A执行完成了之后,主线程才能执行完.
setPriority(): 只能设置Priority但是真正的不一定有用.
setDaemon(): 用户启动的线程基本都是非守护线程,
而由JDK使用的为守护线程, 用户后台资源调度等.
守护线程中finally方法并不一定起作用,因为一旦主线程退出,守护线程就马上也退出了。
线程线资源共享
synchronize关键词
Object 对象锁
可以加在方法或者代码块上,都是对Object加锁
Class 类锁
放在static方法或者对象中的锁