java - 在自己的线程中执行类

标签 java multithreading

我有一个 InstanceFactory 类,它创建某个类的实例,我们将其称为 instance 类。这些实例是在 main() 方法中创建的。在此实例类上,我目前进行诸如 instance.init()instance.put()instance.stop() 之类的调用。

由于所有内容都在单个线程中运行,并且我发现了一些性能问题,因此我想尝试在单独的线程中运行实例。

我必须对实例类进行哪些更改才能让它在单独的线程中运行?我仍然可以调用同样的电话吗? instance.init()

更新(添加代码):

InstanceFactory instanceFactory = new InstanceFactory();
try (Instance instance = instanceFactory.create()) {
    instance.init();
    instance.doStuff();
    while ((input = reader.readNext()) != null) {
        instance.put(input);
    }
}

实例应该在自己的线程中运行。

最佳答案

Executors.newSingleThreadExecutor() 仅创建一个工作线程,因此您将拥有一个主线程+ 一个工作线程 具有 post() 任务的 FIFO 队列。如果您的 post() 方法是线程安全,您应该使用 Executors.newCachedThreadPool() 来根据需要创建如此多的线程。

InstanceFactory instanceFactory = new InstanceFactory();
ExecutorService executor = Executors.newCachedThreadPool();
try (Instance instance = instanceFactory.create()) {
    instance.init();
    instance.doStuff();
    while ((input = reader.readNext()) != null) {
        executor.execute(new Runnable() {
            @Override
            public void run() {
                instance.put(input);
            }
        });
    }
} finally {
    executor.shutdown();
}

我建议您阅读official documentation和一些guides关于ExecutorService

关于java - 在自己的线程中执行类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315314/

相关文章:

java - ShowMessageDialog - 组件

java - 为什么 maven-war-plugin 的行为与标准 maven 依赖解析机制不同

java - Servlet REST API 和线程数据交换

java - 在 Java 中使用线程同时执行多个方法

java - Java 方式的生产者/消费者模式

java - Maven native 插件中可笑的样板

java - jsp:forward 标记转发到 Struts 2 Action

java - 无法使用 SQL 工具查询现有的 Ignite 缓存

c++ - 现实生活中是否存在简单的 bool 指针作为线程取消标志不会有效取消线程的情况?

python - 如何使内置容器(集合、字典、列表)线程安全?