Java线程
2017-10-05 12:39:10 27 举报
AI智能生成
登录查看完整内容
Java线程知识
作者其他创作
大纲/内容
线程常用函数
1、线程睡眠:Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。
3、线程等待:Object类中的wait()方法,导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 唤醒方法。wait()在释放CPU的同时释放了对象锁的控制
4、线程唤醒:Object类中的notify()方法,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会任意选择唤醒其中一个线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有一个notifyAll(),唤醒在此对象监视器上等待的所有线程。
5、线程加入:join()方法,等待其他线程终止。在当前线程中调用另一个线程的join()方法,则当前线程转入阻塞状态,直到另一个进程运行结束,当前线程再由阻塞转为就绪状态。
6、interrupt():向线程发送一个中断信号,让线程在无限等待时(如死锁时)能抛出异常,从而结束线程,但是如果你吃掉了这个异常,那么这个线程还是不会中断的!wait()和sleep()都可以通过interrupt()方法 打断线程的暂停状态 ,从而使线程立刻抛出InterruptedException。
7、其它:isAlive(): 判断一个线程是否存活。activeCount(): 程序中活跃的线程数。 enumerate(): 枚举程序中的线程。 \tcurrentThread(): 得到当前线程。 isDaemon(): 一个线程是否为守护线程。 setDaemon(): 设置一个线程为守护线程。(用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束) setName(): 为线程设置一个名称。 setPriority(): 设置一个线程的优先级,优先级高的线程会获得较多的运行机会。
线程同步
synchronized关键字两种作用域
某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(锁对象是当前实例);synchronized(Obj){/*区块*/}表示对这个区块的资源互斥访问(锁对象是Obj)
某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。对类的所有对象实例起作用。(锁对象是当前类的Class对象)
synchronized关键字是不能继承:基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法
同步锁
Synchronized:只支持阻塞式的等待锁,synchronized的同步是不能Interrupt的
性能:在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock还能维持常态。
线程数据传递
Java线程
概念
进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程。(进程是资源分配的最小单位)
线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)
多任务
主线程:JVM调用程序main()所产生的线程。当前线程:这个是容易混淆的概念。一般指通过Thread.currentThread()来获取的线程。前台线程(用户线程):是指接受后台线程服务的线程后台线程:指为其他线程提供服务的线程,也称为守护线程。JVM的垃圾回收线程就是一个后台线程。用户线程和守护线程的区别在于,是否等待主线程依赖于主线程结束而结束。可以通过isDaemon()和setDaemon()方法来判断和设置一个线程是否为后台线程。
线程的实现
1.继承Thread类
2.实现Runnable接口(推荐)
实现Runnable接口比继承Thread类所具有的优势:1):适合多个相同的程序代码的线程去处理同一个资源2):可以避免java中的单继承的限制3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立4):线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类
3、实现Callable接口并与Future、线程池结合使用。FutureTask实现了两个接口,Runnable和Future,所以它既可以作为Runnable被线程执行,又可以作为Future得到Callable的返回值
线程状态转换
分支主题
线程调度
分时调度:所有线程轮流获得CPU使用权,并平均分配每个线程占用CPU的时间
抢占式调度:根据线程的优先级别来获取CPU的使用权。JVM的线程调度模式采用了抢占式模式。
0 条评论
回复 删除
下一页