多线程1~n叠加,强行使用CountDownLatch实现
写的过程中才意识到自己代码写的多乱
代码如下:
CountDown.java 需要处理的资源类
package juc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
public class CountDown {
private int[] arr;
private int unit;
private CountDownLatch count;
private AtomicInteger res;
public CountDown(int length, int unit) {
arr = new int[length];
this.unit = unit;
init();
// 单个线程处理unit条数据
count = new CountDownLatch(length / unit + 1);
res = new AtomicInteger();
}
/**
* 数组初始化
*/
private void init() {
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
}
public int[] getArr() {
return arr;
}
public CountDownLatch getCount() {
return count;
}
public AtomicInteger getRes() {
return res;
}
public int getUnit() {
return unit;
}
}
WorkThread.java 苦力线程
package juc;
import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;
public class WorkThread implements Runnable {
private CountDown work;
private int start;
private int end;
public WorkThread(CountDown work, int start, int end) {
this.work = work;
this.start = start;
this.end = end;
}
@Override
public void run() {
int res = 0;
for (int i = start; i < end && i < work.getArr().length; i++) {
res += work.getArr()[i];
}
System.out.println(Thread.currentThread().getName() + " count:" +work.getRes().addAndGet(res));
// 标记完成
work.getCount().countDown();
}
}
MergeThread.java 收割线程
package juc;
public class MergeThread implements Runnable {
private CountDown work;
public MergeThread(CountDown work) {
this.work = work;
}
@Override
public void run() {
try {
work.getCount().await();
System.out.println("Result: " + work.getRes());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Main.java
package juc;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main {
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
if(false) {
CountDown work = new CountDown(100000, 10000);
ExecutorService executor = Executors.newFixedThreadPool(5);
MergeThread merge = new MergeThread(work);
executor.execute(merge);
int start = 0;
for (int i = 0; i < work.getArr().length / work.getUnit() + 1; i++) {
executor.execute(new WorkThread(work, start, start + work.getUnit()));
start += work.getUnit();
}
executor.shutdown();
} else {
int res = 0;
for (int i = 0; i < 100000; i++) {
res += i;
}
System.out.println(res);
}
long endTime = System.currentTimeMillis();
try {
Thread.sleep(1000);
System.out.println(endTime - startTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这不是CountDownLatch的正确用法,也不是多线程求和的正确解法。
使用CountDownLatch好的示范如下:
所有人到终点,比赛结束
package juc;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class CountDownLatchTest {
private static final int RUNNER_COUNT = 10;
public static void main(String[] args) throws InterruptedException {
final CountDownLatch begin = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(RUNNER_COUNT);
final ExecutorService exec = Executors.newFixedThreadPool(10);
for (int i = 0; i < RUNNER_COUNT; i++) {
final int NO = i + 1;
Runnable run = new Runnable() {
@Override
public void run() {
try {
begin.await();
Thread.sleep((long)(Math.random() * 10000));
System.out.println("No." + NO + " arrived");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
end.countDown();
}
}
};
exec.submit(run);
}
System.out.println("Game Start ...");
begin.countDown();
end.await();
// end.await(30, TimeUnit.SECONDS);
System.out.println("Game Over.");
exec.shutdown();
}
}
纯粹就是写了玩玩!!!