原创转载请注明出处:http://agilestyle.iteye.com/blog/2342923
acquireUninterruptibly()作用是使等待进入acquire()方法的线程,不允许被中断。
acquireUninterruptibly()还有重载的方法acquireUninterruptibly(int permits),此方法的作用是在等待permits的情况下不允许被中断,如果成功获得锁,则取得指定permits的个数。
Service.java
package org.fool.java.concurrent.semaphore.acquireuninterruptibly;
import java.util.concurrent.Semaphore;
public class Service {
private Semaphore semaphore = new Semaphore(1);
public void testMethod() {
try {
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " begin timer=" + System.currentTimeMillis());
for(int i = 0; i < Integer.MAX_VALUE / 50; i++) {
new String();
Math.random();
}
System.out.println(Thread.currentThread().getName() + " end timer=" + System.currentTimeMillis());
semaphore.release();
} catch (Exception e) {
System.out.println(Thread.currentThread().getName() + " in catch...");
e.printStackTrace();
}
}
}
ThreadA.java
package org.fool.java.concurrent.semaphore.acquireuninterruptibly;
public class ThreadA implements Runnable {
private Service service;
public ThreadA(Service service) {
this.service = service;
}
@Override
public void run() {
service.testMethod();
}
}
ThreadB.java
package org.fool.java.concurrent.semaphore.acquireuninterruptibly;
public class ThreadB implements Runnable {
private Service service;
public ThreadB(Service service) {
this.service = service;
}
@Override
public void run() {
service.testMethod();
}
}
SemaphoreTest.java
package org.fool.java.concurrent.semaphore.acquireuninterruptibly;
public class SemaphoreTest {
public static void main(String[] args) throws InterruptedException {
Service service = new Service();
Thread a = new Thread(new ThreadA(service));
a.setName("A");
a.start();
Thread b = new Thread(new ThreadB(service));
b.setName("B");
b.start();
Thread.sleep(1000);
b.interrupt();
}
}
Run
Note:
线程B被成功中断。
修改Service.java,将
semaphore.acquire();
改为
semaphore.acquireUninterruptibly();
再Run
Note:
线程B没有被中断。