MyTetra Share
Делитесь знаниями!
Чистый пул потоков
Время создания: 06.12.2019 09:59
Раздел: INFO - Development - CUBA
Запись: wwwlir/Tetra/master/base/15755373040c0eq86ilh/text.html на raw.githubusercontent.com

import com.groupstp.rtneo.entity.*;

import com.haulmont.cuba.core.global.*;

import com.groupstp.rtneo.service.*;

import com.haulmont.cuba.core.sys.SecurityContext;

import com.haulmont.cuba.core.sys.AppContext;

import com.haulmont.cuba.core.sys.SecurityContextAwareRunnable

import java.util.concurrent.*;


DataManager dataManager = AppBeans.get(DataManager.NAME);


final SecurityContext securityContext = AppContext.getSecurityContext();


System.out.println("================================================>>> START!!! <<<")


//Создается основной поток

Runnable task = new Runnable() {

public void run() {

//Получается securityContext. Нужен для выполнения потока от имени пользователя

AppContext.setSecurityContext(securityContext);

System.out.println("MAIN THREAD " + Thread.currentThread().getName())

System.out.println("INIT POOL")

//Инициализация пула с указанием количества потоков

ExecutorService executorService = Executors.newFixedThreadPool(2)

def list = []

for(def i=0; i<5; i++){

//Старт потока в методе

startExec(executorService, list)

}

System.out.println("EXECUTOR SHUTDOWN")

//Обязательно закрываем пулл

executorService.shutdown()

//Максимальное время действия потока и проверка его окончания

//def done = executorService.awaitTermination(1, TimeUnit.MINUTES);

// System.out.println("awaitTermination done is "+done)

}


}


//Установка и запуск потока

Thread thread = new Thread(task);

thread.start();


System.out.println(">>> END!!! <<<")



public void startExec(ExecutorService executorService, List<Object> list){

System.out.println("Start exec")

//Добавление потока в пулл с передачей securityContext

Future future = executorService.submit(new SecurityContextAwareRunnable({

try {

System.out.println("=== Start thread > " + Thread.currentThread().getName())

//Для удобства бизнес логика вынесена в отдельный метод

createContract(list)

} catch (Exception e) {

log.error('Error creating entity', e)

}

System.out.println("=== End thread > " + Thread.currentThread().getName())

}))

System.out.println("End exec")

}


public void createContract(List<Object> list){

System.out.println("WORKING IN THREAD " + Thread.currentThread().getName())

Thread.sleep(1000)

}


 
MyTetra Share v.0.65
Яндекс индекс цитирования