Concurrent - Semaphore - tryAcquire

原创转载请注明出处:http://agilestyle.iteye.com/blog/2343117


 

tryAcquire()

无参方法tryAcquire()的作用是尝试获取1个permits,如果获取不到则返回false,此方法通常与if语句结合使用,具有无阻塞的特点。

Service.java

package org.fool.java.concurrent.semaphore.tryacquire;

import java.util.concurrent.Semaphore;

public class Service {
    private Semaphore semaphore = new Semaphore(1);

    public void testMethod() {
        if(semaphore.tryAcquire()) {
            System.out.println(Thread.currentThread().getName() + " invoked...");

            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                String str = new String();
                Math.random();
            }

            semaphore.release();
        } else {
            System.out.println(Thread.currentThread().getName() + " not invoked...");
        }
    }
}

ThreadA.java

package org.fool.java.concurrent.semaphore.tryacquire;

public class ThreadA implements Runnable {
    private Service service;

    public ThreadA(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.testMethod();
    }
}

TheadB.java

package org.fool.java.concurrent.semaphore.tryacquire;

public class ThreadB implements Runnable {
    private Service service;

    public ThreadB(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.testMethod();
    }
}

TryAcquireTest.java

package org.fool.java.concurrent.semaphore.tryacquire;

public class TryAcquireTest {
    public static void main(String[] args) {
        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();
    }
}

Run


 

tryAcquire(int permits)

有参方法tryAcquire(int permits)的作用是尝试获取x个permits,如果获取不到则返回false。

Service.java

package org.fool.java.concurrent.semaphore.tryacquire_1;

import java.util.concurrent.Semaphore;

public class Service {
    private Semaphore semaphore = new Semaphore(3);

    public void testMethod() {
        if(semaphore.tryAcquire(3)) {
            System.out.println(Thread.currentThread().getName() + " invoked...");

            for (int i = 0; i < Integer.MAX_VALUE; i++) {
                String str = new String();
                Math.random();
            }

            semaphore.release(3);
        } else {
            System.out.println(Thread.currentThread().getName() + " not invoked...");
        }
    }
}

ThreadA.java

package org.fool.java.concurrent.semaphore.tryacquire_1;

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.tryacquire_1;

public class ThreadB implements Runnable {
    private Service service;

    public ThreadB(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.testMethod();
    }
}

ThreadC.java

package org.fool.java.concurrent.semaphore.tryacquire_1;

public class ThreadC implements Runnable {
    private Service service;

    public ThreadC(Service service) {
        this.service = service;
    }

    @Override
    public void run() {
        service.testMethod();
    }
}

TryAcquireTest2.java

package org.fool.java.concurrent.semaphore.tryacquire_1;

public class TryAcquireTest2 {
    public static void main(String[] args) {
        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 c = new Thread(new ThreadC(service));

        c.setName("C");
        c.start();
    }
}

Run 


 

tryAcquire(long timeout, TimeUnit unit)

有参方法tryAcquire(long timeout, TimeUnit unit)的作用是在指定的时间内尝试获取1个permits,如果获取不到则返回false。 

修改Service.java

package org.fool.java.concurrent.semaphore.tryacquire_2;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class Service {
    private Semaphore semaphore = new Semaphore(1);

    public void testMethod() {
        try {
            if(semaphore.tryAcquire(3, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + " invoked...");

                for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
                    new String();
                    Math.random();
                }

                semaphore.release();
            } else {
                System.out.println(Thread.currentThread().getName() + " not invoked...");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TryAcquireTest3.java

package org.fool.java.concurrent.semaphore.tryacquire_2;

public class TryAcquireTest3 {
    public static void main(String[] args) {
        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 c = new Thread(new ThreadC(service));

        c.setName("C");
        c.start();
    }
}

Run


 

修改Service.java,注释掉for循环中的两行 

for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
	//new String();
	//Math.random();
}

再Run


 

tryAcquire(int permits, long timeout, TimeUnit unit)

有参方法tryAcquire(int permits, long timeout, TimeUnit unit)的作用是在指定的时间内尝试获取x个permits,如果获取不到则返回false。 

修改Service.java

package org.fool.java.concurrent.semaphore.tryacquire_3;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;

public class Service {
    private Semaphore semaphore = new Semaphore(3);

    public void testMethod() {
        try {
            if(semaphore.tryAcquire(3, 3, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + " invoked...");

                for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
                    new String();
                    Math.random();
                }

                semaphore.release(3);
            } else {
                System.out.println(Thread.currentThread().getName() + " not invoked...");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

TryAcquireTest4.java

package org.fool.java.concurrent.semaphore.tryacquire_3;

public class TryAcquireTest4 {
    public static void main(String[] args) {
        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 c = new Thread(new ThreadC(service));

        c.setName("C");
        c.start();
    }
}

Run


 

修改Service.java,注释掉for循环中的两行 

for (int i = 0; i < Integer.MAX_VALUE / 10; i++) {
	//new String();
	//Math.random();
}
再Run


 

猜你喜欢

转载自agilestyle.iteye.com/blog/2343117