我目前正在创建一个推特机器人。
我有一个监听器监听包含某个标签的状态 - #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 服务,那么以下是一些快速入门的要点:
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
并使用有界队列。因此,根据您的系统容量/应用程序负载,您可以从corePoolSize
100 开始并设置maximumPoolSize
为Integer.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] 删除。
我来说两句