1.java中实现线程通信的方式(说说与线程相关的方法)
1)对象的 wait(long timeout)、wait(long timeout, int nanos)、wait() 方法,组合对象的 notify()、notifyAll()
2)显示锁:Lock.newCondition()、Condition await 系列方法、Condition signal()、signalAll()(JDK 1.5 开始通过 Lock 接口提供了显式锁机制,丰富了锁的功能,可以尝试加锁和加锁超时。Lock 接口中定义了加锁 lock()、释放锁 unlock() 方法 和 newCondition() 产生用于线程之间通信的 Condition 对象的方法)
3)信号量:Semaphore acquire 系列方法、release()系列方法(JDK 1.5 还提供了信号量(semaphore)机制,信号量可以用来限制对某个共享资源进行访问的线程的数量。在对资源进行访问之前,线程必须得到信号量的许可(调用 Semaphore 对象的 acquire()方法);在完成对资源的访问后,线程必须向信号量归还许可(调用 Semaphore 对象的 release()方法)。)
2.用户线程和守护线程
Java线程中有两种线程:①用户线程 ②守护线程
用户线程:平时用到的普通线程均是用户线程
守护线程:指在程序运行的时候在后台提供一种通用服务的线程,守护线程是为用户线程服务的,当有用户线程在运行,那么守护线程同样需要工作,当所有的用户线程都结束时,守护线程也就会停止
注意:
1)设置线程的Daemon为true,且必须在thread.start()之前设置
2)Daemon线程中产生的新线程也是Daemon
3)守护线程不应该去访问固有资源,如进行读写操作(文件,数据库),因为守护线程是跟随用户线程的,当没有用户线程工作时,守护线程会立即结束
没有守护线程:
结果:
有守护线程
结果
守护线程使用的场景:
不适合用于输入输出或计算操作
适用于辅助用户线程场景,如GC,内存管理