Эх сурвалжийг харах

fix(线程池):处理线程池不能回收线程的问题。

yuj 7 жил өмнө
parent
commit
e078cda316

+ 44 - 0
src/main/java/com/uas/platform/b2b/core/util/BoundedExecutor.java

@@ -0,0 +1,44 @@
+package com.uas.platform.b2b.core.util;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.Semaphore;
+
+/**
+ * 线程池执行任务,控制任务提交速度
+ *
+ * history:
+ * Created by huxz 2017-1-20 16:51:07
+ */
+public class BoundedExecutor {
+
+	private final Executor executor;
+
+	private final Semaphore semaphore;
+
+
+	public BoundedExecutor(Executor executor, int bound) {
+		this.executor = executor;
+		this.semaphore = new Semaphore(bound);
+	}
+
+	public void submitTask(final Runnable command)
+			throws InterruptedException {
+		semaphore.acquire();
+		try {
+			executor.execute(new Runnable() {
+
+				@Override
+				public void run() {
+					try {
+						command.run();
+					} finally {
+						semaphore.release();
+					}
+				}
+			});
+		} catch (RejectedExecutionException ignored) {
+			semaphore.release();
+		}
+	}
+}

+ 159 - 0
src/test/java/com/uas/platform/b2b/purc/ThreadUtilsTest.java

@@ -0,0 +1,159 @@
+package com.uas.platform.b2b.purc;
+
+import com.uas.platform.b2b.core.util.BoundedExecutor;
+import com.uas.platform.b2b.core.util.ThreadUtils;
+import com.uas.platform.b2b.erp.model.SaleOut;
+import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+/**
+ * @author yuj
+ * @date 2018/12/17 16:17
+ */
+public class ThreadUtilsTest {
+
+
+    @Test
+    public void testThreadUtil() throws InterruptedException {
+
+        ExecutorService executorService = Executors.newFixedThreadPool(1000);
+        BoundedExecutor executor = new BoundedExecutor(executorService, 1600);
+        for(int i = 0; i < 10000; i++) {
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+            executor.submitTask(() ->  {
+                int total = 0;
+                for (int j = 0; j < 100; j++) {
+                    total += j;
+                }
+                System.out.println(Thread.currentThread().getName() + " - " + Thread.currentThread().getId() + "总计" +  total);
+            });
+        }
+
+        int i = Thread.activeCount();
+        while (i > 10) {
+            System.out.println("还有多少线程正在运行 = " + i);
+        }
+    }
+
+}