首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java EE规范和多线程

Java EE规范和多线程
EN

Stack Overflow用户
提问于 2010-07-09 19:48:01
回答 2查看 32K关注 0票数 29

我正在使用Struts和Spring编写一个Java应用程序。在其中一个操作中,存在繁重的数据库处理,因此存在性能问题。我想知道的是我可以在这里使用多线程吗?我认为Java规范不允许创建自定义线程,而不允许创建由服务器创建的线程(我使用Weblogic)。请指导我完成这件事。

EN

回答 2

Stack Overflow用户

发布于 2010-07-09 20:12:59

之所以有这些限制,主要是因为Java和EJB希望支持透明集群。例如,集群中的一台服务器不应该修改文件,因为这些更改不容易被镜像到其他服务器。对于线程,有一个问题是每个集群还是每个服务器都应该有一个线程。应用服务器也不能很容易地监视这些线程。

也就是说,应该可以像在普通应用程序中一样,在Java服务器中创建线程、套接字连接或访问文件系统。

票数 5
EN

Stack Overflow用户

发布于 2020-04-25 04:26:18

如果你需要运行多个线程,这里有一个简单控件池的建议(或替代方法):

1-将您的上下文(EJB)作为参数传递给您的方法(rest端点、调度器、默认方法)

2-使用互补调度器或实体标志控制状态3-注意数据量/处理量

4-推荐:强烈推荐指标、日志和测试、测试、测试

5-这段代码在SpringBoot上,但在Jboss中(经过修改)在EJB Context下进行了测试--仔细测试

6-根据需要使用/修改:(发送建议/评论)

BaseControlExecutor.java

代码语言:javascript
复制
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;


public class BaseControlExecutor {

    private final ScheduledThreadPoolExecutor poolExec = new ScheduledThreadPoolExecutor(2);

    public void execWithTimeout(final Runnable runnable, long timeout,
            TimeUnit timeUnit) throws Exception {
        execWithTimeout(new Callable<Object>() {
            @Override
            public Object call() throws Exception {
                runnable.run();
                return null;
            }
        }, timeout, timeUnit);
    }

    public <T> T execWithTimeout(Callable<T> callable, long timeout,    TimeUnit timeUnit) throws Exception {

        final Future<T> future = poolExec.submit(callable);

        try {
            return future.get(timeout, timeUnit);
        } catch (TimeoutException e) {
            future.cancel(true);
            throw e;
        } catch (ExecutionException e) {
            Throwable t = e.getCause();
            if (t instanceof Error) {
                throw (Error) t;
            } else if (t instanceof Exception) {
                throw (Exception) t;
            } else {
                throw new IllegalStateException(t);
            }
        }
    }
}

EndpointControlRest.java

代码语言:javascript
复制
import java.time.Duration;
import java.time.Instant;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicLong;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@RestController
@RequestMapping(value = "/report")
@Api(tags = "Endpoint of Future")
public class EndpointControlRest extends BaseControlExecutor {

    Logger logger = LoggerFactory.getLogger(EndpointControlRest.class);

    //single metric of execution
    protected final AtomicLong counter = new AtomicLong();

    @GetMapping(path = "/withThread", produces = { "application/json" })
    @ApiOperation(value = "Return Hello count.")
    public String greeting() {

        Long countRunner = counter.incrementAndGet();
        String json = ""; //or EJB context to use in Thread - becareful

        new Thread(() -> {

            try {
                execWithTimeout(new Runnable() {
                    @Override
                    public void run() {

                        Instant start = Instant.now();
                        logger.info("Report init - " + countRunner);

                        //generating reports
                        generateBackgroundReport(json);

                        logger.info("Report End - " + countRunner);

                        Instant finish = Instant.now();
                        long timeElapsed = Duration.between(start, finish).toMillis();

                        logger.info("###DEBUG - " + countRunner + " - OK |Time exe: " + timeElapsed);

                    }
                }, 120, TimeUnit.SECONDS);
            } catch (TimeoutException e) {
                logger.info("###DEBUG - " + countRunner + " - Timeout - " + e.getMessage());
            } catch (Exception e) {
                logger.info("###DEBUG - " + countRunner + " - Exception - " + e.getMessage());
            }
        }).start();

        logger.info("####DEBUG - Rest call released");
        return "Hello " + countRunner;
    }

    public String generateBackgroundReport(String json){

        //simulating work
        Long x = 0L;
        for(Long i = 0L; i < 1000000000L; i ++){
            x = i + 1;
        }
        logger.info("####DEBUG -report: " + x);
        return "OK";
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3212255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档