要求:
(1)自定義容器,提供新增元素(add)和獲取元素數量(size)的方法。
(2)啟動兩個線程。線程1向容器中新增10個數據。線程2監聽容器元素數量,當容器元素數量為5時,線程2輸出信息并終止。
方式一:
public class Test1 {
public static void main(String[] args) {
Test1_Container t = new Test1_Container();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("add Object to Container " + i);
t.add(new Object());
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
public void run() {
while (true) {
if (t.size() == 5) {
System.out.println("Container's size = 5");
break;
}
}
}
}).start();
}
}
class Test1_Container {
volatile List<Object> container = new ArrayList<>();
public void add(Object o) {
this.container.add(o);
}
public int size() {
return container.size();
}
}
方式二:
public class Test2 {
public static void main(String[] args) {
final Test2_Container t = new Test2_Container();
final Object lock = new Object();
new Thread(new Runnable() {
public void run() {
synchronized (lock) {
if (t.size() != 5) {
try {
lock.wait(); // 線程進入等待隊列。
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("size = 5");
lock.notifyAll(); // 喚醒其他等待線程
}
}
}).start();
new Thread(new Runnable() {
public void run() {
synchronized (lock) {
for (int i = 0; i < 10; i++) {
System.out.println("add Object to Container " + i);
t.add(new Object());
if (t.size() == 5) {
lock.notifyAll();
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}).start();
}
}
class Test2_Container {
List<Object> container = new ArrayList<>();
public void add(Object o) {
this.container.add(o);
}
public int size() {
return container.size();
}
}
方式三:
public class Test3 {
public static void main(String[] args) {
Test3_Container t = new Test3_Container();
CountDownLatch latch = new CountDownLatch(1);// 門閂
new Thread(new Runnable() {
public void run() {
if (t.size() != 5) {
try {
latch.await();// 等待門閂開啟,不是進入等待隊列
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("size = 5");
}
}).start();
new Thread(new Runnable() {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("add Object to Container " + i);
t.add(new Object());
if (t.size() == 5) {
latch.countDown();// 門閂-1
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
}
class Test3_Container {
List<Object> container = new ArrayList<>();
public void add(Object o) {
this.container.add(o);
}
public int size() {
return container.size();
}
}