package test.thread;
import java.util.ArrayList;
import java.util.Random;
public class TestThread {
static long nanoTimeStart;
static class Sender implements Runnable {
Holder holder;
int index;
Sender(Holder holder, int index) {
this.holder = holder;
this.index = index;
}
@Override
public void run() {
System.out.println(index + " + Thread Sender START -- at " + (System.nanoTime() - nanoTimeStart));
try {
Request req = new Request(index);
Response res = holder.request(req);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(index + " + Thread Sender STOP -- at " + (System.nanoTime() - nanoTimeStart));
}
}
static class Holder implements Runnable {
ArrayList<Request> dd = new ArrayList<Request>();
Response request(Request req) throws InterruptedException {
synchronized (req) {
synchronized (dd) {
dd.add(req);
}
req.wait();
}
return new Response();
}
@Override
public void run() {
System.out.println("Thread Holder START -- at " + (System.nanoTime() - nanoTimeStart));
try {
for (;;) {
Random r = new Random(1);
synchronized (dd) {
Thread.sleep(10);
if (dd.size() > 0) {
int i = r.nextInt(dd.size());
Request req = dd.get(i);
dd.remove(i);
Thread.sleep(r.nextInt(100));
synchronized (req) {
req.notify();
}
Thread.sleep(100);
}
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread Holder STOP -- at " + (System.nanoTime() - nanoTimeStart));
}
}
static class Request {
int index;
public Request(int index) {
this.index = index;
}
}
static class Response {
}
public static void main(String[] args) {
Holder holder = new Holder();
Thread tH = new Thread(holder);
tH.start();
Random r = new Random(1);
nanoTimeStart = System.nanoTime();
try {
for (int i = 0; i < 10; i++) {
Thread.sleep(r.nextInt(1));
Thread tS = new Thread(new Sender(holder, i));
tS.start();
}
} catch (InterruptedException e) {
}
}
}