前面示例是在自定义的MyThread类中处理业务,而业务代码要尽量放在
Service
业务类中进行处理,这样代码更加标准
创建类MyList.java代码
package chapter3.test3_1.test3_1_7;
import java.util.ArrayList;
import java.util.List;
public class MyList {
volatile private List list = new ArrayList();
public void add() {
list.add("anyString");
}
public int size() {
return list.size();
}
}
创建类MyService.java代码
package chapter3.test3_1.test3_1_7;
public class MyService {
private Object lock = new Object();
private MyList list = new MyList();
public void waitMethod() {
try {
synchronized (lock) {
if (list.size() != 5) {
System.out.println("begin wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
lock.wait();
System.out.println(" end wait " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void notifyMethod() {
try {
synchronized (lock) {
System.out.println("begin notify " + System.currentTimeMillis() + " " + Thread.currentThread().getName());
for (int i = 0; i < 10; i++) {
list.add();
if (list.size() == 5) {
lock.notify();
System.out.println("仅仅是发出通知而已,wait后面的代码并没有立即执行,因为锁没有释放");
}
System.out.println("add次数:" + (i + 1));
Thread.sleep(1000);
}
System.out.println("end notify" + System.currentTimeMillis() + "" + Thread.currentThread().getName());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
创建类MyThreadA.java
package chapter3.test3_1.test3_1_7;
public class MyThreadA extends Thread {
private MyService service;
public MyThreadA(MyService service) {
super();
this.service = service;
}
@Override
public void run() {
service.waitMethod();
}
}
创建类MyThreadcB.java
package chapter3.test3_1.test3_1_7;
public class MyThreadB extends Thread {
private MyService service;
public MyThreadB(MyService service) {
super();
this.service = service;
}
@Override
public void run() {
service.notifyMethod();
}
}
创建类Test.java代码
package chapter3.test3_1.test3_1_7;
public class Test {
public static void main(String[] args) throws InterruptedException {
MyService service = new MyService();
MyThreadA t1 = new MyThreadA(service);
t1.start();
Thread.sleep(5000);
MyThreadB t2 = new MyThreadB(service);
t2.start();
}
}
控制台运行结果