package test;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class ThreadTest {
private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(2);
private List<String> strs = new ArrayList<String>();
// 当 excutor 调度 C2 的时候,将触发addStr方法,这个时候应为设置了同步,所以底边的getStr方法将不能被执行,除非addStr执行完毕才把控制权交给getStr
// synchronized方法标示和域标示synchronized (blockObj) 效果一样
public synchronized void addStr(String str) {
//synchronized (strs) {
try {
strs.add(str);
Thread.sleep(4000);
System.out.println("--");
} catch (InterruptedException e) {
e.printStackTrace();
}
//}
}
public synchronized String getStr() {
//synchronized (strs) {
return strs.get(strs.size() - 1);
//}
}
class C1 implements Runnable {
@Override
public void run() {
System.out.println("-C!-");
System.out.println(getStr());
}
}
class C2 implements Runnable {
@Override
public void run() {
addStr(Long.toString(System.currentTimeMillis()));
}
}
public void check() {
executor.schedule(new C2(), 1, TimeUnit.SECONDS);
executor.schedule(new C1(), 2, TimeUnit.SECONDS);
}
public static void main(String[] args) {
ThreadTest tt = new ThreadTest();
tt.check();
}
}
java synchronized(同步处理并发)
最新推荐文章于 2022-02-25 23:02:56 发布