首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在线程内部,如何正确地停止和重新启动线程?

在线程内部,如何正确地停止和重新启动线程?
EN

Stack Overflow用户
提问于 2022-11-10 16:22:16
回答 1查看 49关注 0票数 1

我正在运行一个具有业务服务的SpringBoot应用程序,它不断地触发一个方法,该方法用它的消息填充一个全局队列。在此方法中,由于每秒触发的次数超过15-30次,该方法检查布尔值的全局数组,以确保没有启动特定索引的线程(0-7)。如果线程未启动,则该方法将触发该线程。每个线程负责读取消息的全局队列,并对此消息执行任务。但是,我注意到,随着应用程序运行时间的延长,我只看到其中一个线程运行该操作,而其他线程则被卡住了。

我的问题是,如果我有:

代码语言:javascript
复制
public static void onMessage(String record) {
     global.add(record);
     if(threads[0] == false) {
     threads[0] = true;
     thread0.start() // Name of the thread index included in runnable
> }

基本上,上面的内容是不断触发的,填充队列,尝试启动线程,就是这样。

那我就有:

代码语言:javascript
复制
public void run() { 
    String recordToUse;
    int thread_num = Integer.parseInt(Thread.currentThread().getName());
    long startThreadTime = System.currentTimeMillis();
    long endThreadTime = startThreadTime + 60 * 1000; // Run the thread for 1 minute.
                
    while(System.currentTimeMillis() < endThreadTime) {
        if(!global.isEmpty()) {
            recordToUse = global.remove();
            System.out.println("Successful removal: Thread-"+ thread_num);
        } else {
            continue; // If the queue is empty, keep checking until it is not empty. 
        }
        // Then we have more operations that work on the message
    }
    threads[thread_num] = false; // Mark that this thread is now finished and the onMessage method knows it can start another thread.
    return;
}

runnable实现将一个数字作为参数来存储线程中的线程数,因此我们有类似于Thread thread1 = new (runnable,"0");,以便上面的线程知道它是数字0索引。

在应用程序按预期运行之后,我首先看到,在8个预期线程中,最初运行良好,并显示如下消息:

代码语言:javascript
复制
Successful removal: Thread-2
Successful removal: Thread-0
Successful removal: Thread-5
Successful removal: Thread-7
Successful removal: Thread-4
Successful removal: Thread-1

但是在大约5-10分钟之后,它将重点放在一个单个线程上。我只看到这样的信息:

代码语言:javascript
复制
Successful removal: Thread-6
Successful removal: Thread-6
Successful removal: Thread-6
Successful removal: Thread-6
Successful removal: Thread-6
Successful removal: Thread-6

我不太清楚发生了什么,一些指导将是伟大的!我的想法是线程正在访问一个同步方法,而其他线程都在等待它,但我不确定是否会这样,因为它们最初都在工作。

谢谢。

我一直试图在这里和那里休眠线程,我一直在玩线程的继续部分,但是我看不到这些线程被卡在哪里。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-20 16:28:40

  1. 创建并发阻塞队列。(请参阅java.util.concurrent.BlockingQueue.)
  2. Keep将您的项目添加到该队列中,而无需担心谁在读取它们时读取它们。
  3. 创建N个线程,其中每个线程只是运行,而不让任何人知道它是否繁忙。
  4. 每个线程运行一个循环,从队列读取下一项并对其进行处理。若要从队列中读取下一项,请使用阻塞脱队列方法,这样线程将被阻塞,直到某个项目为available.
  5. When --您希望线程退出--对一个特殊哨兵值的N个实例进行排队,它的意思是“请退出”。每个队列检查该值,quits.
  6. You是done.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74392204

复制
相关文章

相似问题

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