import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; // starvation sample class, // uses java.util.concurrent.locks facilities, // illustrates thread starvation // (especially on a single cpu machine) public class starvation2 implements Runnable { private final Lock resource_; private final String message_; private final boolean fair_; // program entry point public static void main(String[] args) { boolean fair = false; if (args != null && args.length>= 1 && args[0].equals("fair")) { fair = true; } // get the number of available cpus; do twice as much threads final int cpus = Runtime.getRuntime().availableProcessors(); System.out.println("" + cpus + " available cpus found"); final int runners = cpus * 2; System.out.println("starting " + runners + " runners"); final Lock resource = new ReentrantLock(fair); // create sample runners and start them for (int i = 1; i <= runners; i++) { (new Thread(new starvation2(resource, String.valueOf(i), fair))).start(); } // suspend main thread synchronized (starvation2.class) { try { starvation2.class.wait(); } catch (InterruptedException ignored) { } } } public starvation2(Lock resource, String message, boolean fair) { resource_ = resource; message_ = message; fair_ = fair; } public void run() { synchronized (this) { for (;;) { resource_.lock(); try { print(message_); // some delay; try { wait(100); } catch (InterruptedException ignored) { } } finally { resource_.unlock(); } } } } private static void print(String s) { synchronized (System.out) { System.out.print(s); System.out.flush(); } } } /* "Thread-3" prio=1 tid=0xa8148f28 nid=0x700 waiting on condition [0xa7f7b000..0xa7f7be50] at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:681) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:711) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1041) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:184) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) at starvation2.run(starvation2.java:58) - locked <0xa8a1ca48> (a starvation2) at java.lang.Thread.run(Thread.java:595) "Thread-2" prio=1 tid=0xa81481b8 nid=0x6ff waiting on condition [0xa7ffc000..0xa7ffcfd0] at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:681) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:711) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1041) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:184) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) at starvation2.run(starvation2.java:58) - locked <0xa8a1c8e0> (a starvation2) at java.lang.Thread.run(Thread.java:595) "Thread-1" prio=1 tid=0xa8147580 nid=0x6fe waiting on condition [0xa807d000..0xa807df50] at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:118) at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:681) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:711) at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1041) at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:184) at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:256) at starvation2.run(starvation2.java:58) - locked <0xa8a1c778> (a starvation2) at java.lang.Thread.run(Thread.java:595) "Thread-0" prio=1 tid=0xa8147058 nid=0x6fd in Object.wait() [0xa80fe000..0xa80ff0d0] at java.lang.Object.wait(Native Method) - waiting on <0xa8a1c610> (a starvation2) at starvation2.run(starvation2.java:64) - locked <0xa8a1c610> (a starvation2) at java.lang.Thread.run(Thread.java:595) */

AltStyle によって変換されたページ (->オリジナル) /