Browse Source

多线程设置主线程同步处理

zhouy 5 years ago
parent
commit
c7095c25a3

+ 6 - 2
src/main/java/com/uas/eis/core/config/AsyncConfig.java

@@ -5,6 +5,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 
 import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
 
 /**
  * @Author: zhouy
@@ -18,9 +19,9 @@ public class AsyncConfig{
     public Executor asyncExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //核心线程数10:线程池创建时候初始化的线程数
-        executor.setCorePoolSize(5);
+        executor.setCorePoolSize(2);
         //最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
-        executor.setMaxPoolSize(5);
+        executor.setMaxPoolSize(2);
         //缓冲队列500:用来缓冲执行任务的队列
         executor.setQueueCapacity(500);
         //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
@@ -29,6 +30,9 @@ public class AsyncConfig{
         executor.setThreadNamePrefix("DailyAsync-");
         //所有任务处理完毕开始关闭线程池
         executor.setWaitForTasksToCompleteOnShutdown(true);
+        // rejection-policy:当pool已经达到max size的时候,如何处理新任务
+        // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
         executor.initialize();
         return executor;
     }

+ 3 - 1
src/main/java/com/uas/eis/service/DataDealService.java

@@ -1,9 +1,11 @@
 package com.uas.eis.service;
 
+import java.util.concurrent.CountDownLatch;
+
 /**
  * @Author: zhouy
  * @Date: 2020/5/22 13:54
  */
 public interface DataDealService {
-     void EDCDataDeal(String path);
+     void EDCDataDeal(String path, CountDownLatch countDownLatch);
 }

+ 19 - 2
src/main/java/com/uas/eis/serviceImpl/DataDealServiceImpl.java

@@ -8,6 +8,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 
+import java.util.concurrent.CountDownLatch;
+
 /**
  * @Author: zhouy
  * @Date: 2020/5/22 13:55
@@ -22,9 +24,24 @@ public class DataDealServiceImpl  implements DataDealService {
 
     @Override
     @Async("taskExecutor")
-    public void EDCDataDeal(String path) {
-        System.out.println(path);
+    public void EDCDataDeal(String path, CountDownLatch countDownLatch) {
+        logger.info("线程-" + Thread.currentThread().getId() + "在执行写入");
+        int k = 0;
+        try {
+
+            for (int i = 0; i < 1000000000; i++) {
+                k++;
+                for (int j = 0; j < 10000; j++) {
+                   // k++;
+                }
+            }
+        }catch (Exception e) {
+            e.printStackTrace();
 
+        } finally {
+            countDownLatch.countDown();
+        }
+        System.out.println("线程" + Thread.currentThread().getId() + "执行结束:"+k);
 
     }
 }

+ 17 - 3
src/test/java/com/uas/eis/UasEisApplicationTests.java

@@ -1,6 +1,5 @@
 package com.uas.eis;
 
-import com.uas.eis.dao.BaseDao;
 import com.uas.eis.service.DataDealService;
 import com.uas.eis.service.SaleReturnService;
 import com.uas.eis.service.SaleService;
@@ -10,6 +9,9 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit4.SpringRunner;
 
+import java.util.Date;
+import java.util.concurrent.CountDownLatch;
+
 @RunWith(SpringRunner.class)
 @SpringBootTest(classes = {UasEisApplication.class})
 public class UasEisApplicationTests {
@@ -22,11 +24,23 @@ public class UasEisApplicationTests {
 	private DataDealService dataDealService;
 
 
+
+
 	@Test
 	public void contextLoads() {
-		for(int i =0 ; i<10000 ;i++){
-			dataDealService.EDCDataDeal("helo"+i);
+		final CountDownLatch countDownLatch = new CountDownLatch(10);
+		Date date1 =new Date();
+		System.out.println("主线程开始---");
+
+		try {
+			for(int i =0 ; i<10 ;i++){
+				dataDealService.EDCDataDeal("helo"+i,countDownLatch);
+			}
+			countDownLatch.await();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
 		}
+		System.out.println("用时:"+(new Date().getTime()-date1.getTime()));
 
 	}