- 测试类:
package practice.thread;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class TestThreadPool {
public static void main(String[] args) {
new TestThreadPool().execute();
}
public void execute() {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(4, 8, 5,
TimeUnit.MINUTES, new ArrayBlockingQueue<>(200), new ThreadPoolExecutor.CallerRunsPolicy());
System.out.println(threadPoolExecutor.toString());
System.out.println("主线程开始");
System.out.println("任务一开始");
CountDownLatch countDownLatch = new CountDownLatch(5);
for (int i = 0; i < 5; i++) {
ThreadPoolTask testThreadPoolTask = new ThreadPoolTask<TestThreadPool>()
.setT(this)
.setMethodName("method")
.setField(String.valueOf(i))
.setCountDownLatch(countDownLatch);
threadPoolExecutor.execute(testThreadPoolTask);
}
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务一结束");
System.out.println("任务二开始");
CountDownLatch countDownLatch2 = new CountDownLatch(3);
for (int i = 0; i < 3; i++) {
ThreadPoolTask testThreadPoolTask = new ThreadPoolTask<TestThreadPool>()
.setT(this)
.setMethodName("method")
.setField(String.valueOf(i) + "---")
.setCountDownLatch(countDownLatch2);
threadPoolExecutor.execute(testThreadPoolTask);
}
try {
countDownLatch2.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务二结束");
threadPoolExecutor.shutdown();
System.out.println("主线程结束");
}
public void method(List<String> params) {
params.stream().forEach(System.out::println);
}
}
- 线程类:
package practice.thread;
import lombok.Data;
import lombok.experimental.Accessors;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@Data
@Accessors(chain = true)
public class ThreadPoolTask<T> implements Runnable {
private T t;
private String methodName;
private String field;
private CountDownLatch countDownLatch;
@Override
public void run() {
List<String> arrayList = new ArrayList<>();
arrayList.add(field);
try {
Method method = t.getClass().getMethod(methodName, List.class);
method.invoke(t, arrayList);
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
}
}
运行结果: