如何在多线程应用程序中存储线程

写字板

我目前正在创建一个推特机器人。

我有一个监听器监听包含某个标签的状态 - #DealMeIn。当使用此主题标签找到状态时,我有一个方法可以创建一个新线程,该线程可以玩游戏:

public void onTweet() {
  Thread t = new Thread(new Game());
  t.start();
}

上述方法的问题,如果我没记错的话,就是每次找到推文时 t 都会被覆盖。所以,我认为一个合适的替代方法是使用ArrayList<Thread> threads这样的:

public void onTweet() {
  threads.add(new Thread(new Game()));
  threads.get(threads.size()-1).start();
}

这是处理我的线程的合适方法吗?

编辑:如果用户发推文,例如,#DealMeOut 那么我需要能够停止线程。

哈格拉瓦尔

@Michael 给出的答案很好,但我更愿意通过使用 Java 的executor service来完成这项工作,因为它提供了更多的控制、优雅的方式来做到这一点,这就是 Java 提供的 API 来处理这些情况。

请参阅下面的代码示例。这种方法的明显优势是您可以控制在 JVM 中运行的最大线程数,这非常重要,否则随着时间的推移,您的应用程序可能会开始计时,因此这为您的应用程序/解决方案提供了更大的可扩展性

如果您不了解 Java 的 executor 服务,那么以下是一些快速入门的要点:

  • Java 的实用程序类Executors将创建和返回对象ExecutorService(请注意ExecutorService是一个接口)。
  • 现在,在 的情况下newCachedThreadPool()newFixedThreadPool(int nThreads)您将获得一个对象ThreadPoolExecutor(请注意ThreadPoolExecutor实现了ExecutorService接口)。
  • 当你这样做时Executors.newFixedThreadPool(2);,你只会得到一个对象,ThreadPoolExecutor其中包含所有实例变量,如核心池大小、最大池大小等。在你的情况下,它将被设置为 2。
  • 现在,private final static ExecutorService executorService = Executors.newFixedThreadPool(2);对于这个线程池,您的 JVM 中将始终有最多 2 个线程,并且任何多余的请求都将在LinkedBlockingQueue实现中排队,因为它LinkedBlockingQueue是一个无界队列,因此您永远不会丢失任务。
  • 假设您想在负载更多时创建更多线程,那么您必须玩弄maximumPoolSize并使用有界队列。因此,根据您的系统容量/应用程序负载,您可以从corePoolSize100 开始并设置maximumPoolSizeInteger.MAX_VALUE.

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorServiceImplementationExample {
    private final static int MAX_NUMBER_OF_THREADS = Integer.MAX_VALUE;

    // set maximum number of threads as per your requirement/performance tuning, for testing set it to "2" and to have better feel.
    private final static ExecutorService executorService = Executors.newFixedThreadPool(MAX_NUMBER_OF_THREADS);


    public static void main(String[] args) {
        System.out.println("### Starting.");

        new Thread(){
            @Override
            public void run() {
                scheduleTask(new MyRunnableTask());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                scheduleTask(new MyRunnableTask());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                scheduleTask(new MyRunnableTask());
            }
        }.start();

        new Thread(){
            @Override
            public void run() {
                scheduleTask(new MyRunnableTask());
            }
        }.start();

        System.out.println("### Completed.");
    }

    private static void scheduleTask(Runnable runnable) {
        executorService.execute(runnable);
    }

}

MyRunnableTask.java

public class MyRunnableTask implements Runnable {

    @Override
    public void run() {
        System.out.println("I am getting executed: " + this.hashCode() + " | " + Thread.currentThread().getId());
        try {
            Thread.sleep(2000); // this sleep is only for testing to give a feel of how solution will work, remove after testing.
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

在您的情况下,您将执行以下操作,并且您需要executorService在开始时创建并且您的Game类应该实现Runnable接口。

public void onTweet() {
  executorService.execute(new Game());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在IntelliJ中调试多线程应用程序?

来自分类Dev

如何在多线程应用程序中使用Hibernate?

来自分类Dev

多线程应用程序中的QTimer

来自分类Dev

ncurses在多线程应用程序中

来自分类Dev

GHC如何在多线程应用程序中强制执行评估?

来自分类Dev

GHC如何在多线程应用程序中强制执行评估?

来自分类Dev

多线程应用程序如何在多处理器系统中工作

来自分类Dev

如何在Visual Studio中将多线程应用程序调试为单线程

来自分类Dev

如何管理多线程C#应用程序

来自分类Dev

如何管理 Python Tkinter 应用程序多线程

来自分类Dev

在多线程应用程序中划分大文件?

来自分类Dev

在多线程c#应用程序中嵌入Python

来自分类Dev

多线程应用程序中的死锁检测

来自分类Dev

多线程在Web应用程序中的作用

来自分类Dev

多线程应用程序中的System.ObjectDisposedException

来自分类Dev

多线程应用程序中的Apache HttpClient和HttpConnection

来自分类Dev

ZeroMQ处理多线程应用程序中的中断

来自分类Dev

在多线程应用程序中锁定和解锁

来自分类Dev

多线程应用程序中的DLL和类

来自分类Dev

多线程应用程序中的日志队列

来自分类Dev

多线程应用程序中的静态方法

来自分类Dev

多线程应用程序中的字典(内存管理?)

来自分类Dev

多线程应用程序中的多核JIT

来自分类Dev

在多线程应用程序中安全使用迭代器

来自分类Dev

Javascript应用程序中的多线程错觉

来自分类Dev

表单应用程序中的意外多线程

来自分类Dev

多线程应用程序中的原子布尔用法

来自分类Dev

在多线程应用程序中在哪里设置锁?

来自分类Dev

如何在python GUI应用程序中创建线程?

Related 相关文章

热门标签

归档