hasQueueThread(Thread thread):方法用于测试thread线程是否在等待当前lock。
hasQueueThreads():方法用于测试是否有现成在等待当前lock。
package com.lenovo.plm.dms.p21;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
public ReentrantLock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
public void waitMethod(){
lock.lock();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
}
package com.lenovo.plm.dms.p21;
public class Main {
public static void main(String[] args) {
final Service service = new Service();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
service.waitMethod();
}
};
Thread threadA = new Thread(runnable);
threadA.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Thread threadB = new Thread(runnable);
threadB.start();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(service.lock.hasQueuedThread(threadA));
System.out.println(service.lock.hasQueuedThread(threadB));
System.out.println(service.lock.hasQueuedThreads());
}
}
测试结果如下:
false
true
true
hasWaiters(Condition condition):方法用于测试是否有现成在等待当前condition对象。
getWaitQueueLength(condition):方法用于测试当前正在等待condition对象的线程数量。
package com.lenovo.plm.dms.p22;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private ReentrantLock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
public void waitMethod(){
lock.lock();
try {
System.out.println("To check if has threads waiting condition:"+lock.hasWaiters(condition) + " and thread is: "+ lock.getWaitQueueLength(condition));
condition.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void notifyMethod(){
lock.lock();
System.out.println("To check if has threads waiting condition:"+lock.hasWaiters(condition) + " and thread is: "+ lock.getWaitQueueLength(condition));
condition.signal();
lock.unlock();
}
}
package com.lenovo.plm.dms.p22;
public class Main {
public static void main(String[] args) {
final Service service = new Service();
Runnable runnable = new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
service.waitMethod();
}
};
Thread[] threadArray = new Thread[10];
for(int i = 0;i<10;i++){
threadArray[i] = new Thread(runnable);
}
for(int i = 0;i<10;i++){
threadArray[i].start();
}
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
service.notifyMethod();
}
}
测试结果如下:
To check if has threads waiting condition:false and thread is: 0
To check if has threads waiting condition:true and thread is: 1
To check if has threads waiting condition:true and thread is: 2
To check if has threads waiting condition:true and thread is: 3
To check if has threads waiting condition:true and thread is: 4
To check if has threads waiting condition:true and thread is: 5
To check if has threads waiting condition:true and thread is: 6
To check if has threads waiting condition:true and thread is: 7
To check if has threads waiting condition:true and thread is: 8
To check if has threads waiting condition:true and thread is: 9
To check if has threads waiting condition:true and thread is: 10