67,513
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) throws IOException, InterruptedException {
String [] strings = new String[]{"a","b","c","d","e"};
ExecutorService executorService = Executors.newFixedThreadPool(5);
for (int i=0; i<strings.length; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
strings[index] = strings[index] + "B";
}
});
}
executorService.shutdown();
executorService.awaitTermination(5L, TimeUnit.SECONDS);
for (String string : strings) {
System.out.println(string);
}
}
每个线程都计算独立的数据,所以,不存在互斥和临界区的问题。只要等待所有线程计算完成即可输出结果。
private volatile static int sig = 0;
public static void main(String[] args) {
String [] strings = new String[]{"a","b","c","d","e"};
String append = "B";
ReentrantLock lock = new ReentrantLock();
Condition[] conditions = new Condition[5];
for (int i=0;i<5;i++){
conditions[i] = lock.newCondition();
}
for (int i=0;i<5;i++){
int j= i;
new Thread(()->{
lock.lock();
try {
if(sig != j){
conditions[j].await();
}
System.out.println(strings[j]+append);
Thread.sleep(100);
sig = j+1;
if(j+1<5){
conditions[j+1].signal();
}
}catch (Exception e){
e.printStackTrace();
}finally {
lock.unlock();
}
}).start();
}
}
结果:
aB
bB
cB
dB
eB