当前位置: 首页 > 知识库问答 >
问题:

创建2个线程,每个线程运行不同的任务

陈毅
2023-03-14
Rules rule;
        Request build() {
            Request request = new Request(this);
        //I want one threat to call this method
        Boolean isExceeding = this.rule.volumeExceeding(request);

        //Another thread to call this method
        Boolean isRepeating = this.rule.volumeRepeating(request);
        
        //Some sort of timer that will wait until both values are received,
        //If one value takes too long to be received kill the thread and continue with
        //whatever value was received.

        ..Logic based on 2 booleans..
        return request;
    }
        
    
public class Rules {

    public Boolean volumeExceeding(Request request) {

        ...some...logic...
        return true/false;
    }


    public Boolean volumeRepeating(Request request) {
       
        ...some...logic...
        return true/false;
    }
}

共有1个答案

丰佐
2023-03-14

一种方法是使用CompletableFutures:

import java.util.concurrent.CompletableFuture;

class Main {
    
    private static final long timeout = 1_000; // 1 second

    
    static Boolean volumeExceeding(Object request) {
        System.out.println(Thread.currentThread().getName());
        final long startpoint = System.currentTimeMillis();
        
        // do stuff with request but we do dummy stuff
        for (int i = 0; i < 1_000_000; i++) {
            if (System.currentTimeMillis() - startpoint > timeout) {
                return false;
            }
            Math.log(Math.sqrt(i));
        }
        return true;
    }
    
    
    static Boolean volumeRepeating(Object request) {
        System.out.println(Thread.currentThread().getName());
        final long startpoint = System.currentTimeMillis();
        
        // do stuff with request but we do dummy stuff
        for (int i = 0; i < 1_000_000_000; i++) {
            if (System.currentTimeMillis() - startpoint > timeout) {
                return false;
            }
            Math.log(Math.sqrt(i));
        }
        return true;
    }
    

    public static void main(String[] args) {
        final Object request = new Object();
        
        CompletableFuture<Boolean> isExceedingFuture = CompletableFuture.supplyAsync(
                () -> Main.volumeExceeding(request));
        CompletableFuture<Boolean> isRepeatingFuture = CompletableFuture.supplyAsync(
                () -> Main.volumeRepeating(request));
        
        Boolean isExceeding = isExceedingFuture.join();
        Boolean isRepeating = isRepeatingFuture.join();
        
        System.out.println(isExceeding);
        System.out.println(isRepeating);
    }
}

请注意,一个任务比另一个任务花费的时间要长得多。

出什么事了?通过使用CompletableFuture执行,可以将这些任务提供给公共池。这两个任务都由两个不同的线程执行。您所要求的是,当一项任务花费太长时间时,它将被停止。因此,您可以简单地记住任务开始的时间,并定期检查超时时间。重要事项:在任务返回的时候进行此检查,同时保持数据处于一致状态。还要注意,您当然可以放置多个检查。

 类似资料:
  • 我正在创建一个可以监视100-150个设备的监视应用程序...现在要设计一个监视器应用程序,我有两种方法: > < li> 为每个要监控的设备创建一个线程,每个线程将ping(使用ICMP)设备以了解设备是否在线。这些线程将无限期地运行,以便在特定的时间间隔(比如60秒)后了解它们的状态。 创建一个线程池,并为每个设备提交一个任务到一个线程池。任务是简单地 ping 到设备。因此,在当前设计中,任

  • 我正在使用Python和tkinter创建一个游戏,当我试图添加一些音乐时,制作音乐的函数停止了脚本的其余部分(还有窗口)。所以我需要创建一个新的线程来播放音频并保持窗口工作... 我尝试了一些错误、不运行或停止窗口的事情,目前我有: 重要的细节:playSound函数什么也不返回,所以什么都不需要等待它。我也不太懂用Python编程,我更喜欢用Luau。

  • 问题内容: 因此,我的目标是让函数启动自己的线程,以便可以并行运行,而不必等待上一个线程完成。问题在于,它似乎不是多线程的(意味着一个线程在另一个线程开始之前就完成了)。 我也有该函数的内部,但似乎启动的线程的标识与从其运行python脚本的主线程相同。我认为我的方法不正确。 问题答案: 这是常见错误,容易出错。 只需在主线程中一次执行您的函数,然后将(我想为您函数的返回值)作为函数传递给线程,这

  • 问题内容: 我有一个简单的线程是这样的: 编辑:开始运行的附加代码 它是主要活动的内部类。但是, 此线程 不是在主 活动 上 运行,而是在 另一个 在 主 活动上 运行的线程 内部 运行 。 无论如何,此示例与此处 完全相同 ,但是由于某种原因,它给了我java.lang.RuntimeException:每个线程只能创建一个Looper。 我没有创建任何其他循环程序,至少在任何地方都没有。 问题

  • 问题内容: 我已经研究了很多关于Java线程的教程,但是找不到答案。 我的问题是:如何同时运行两个独立的线程? 我的情况是:我有两个任务; 保存一些数据到数据库 在移动设备上发送推送通知。 由于这两个任务是独立的,因此我想同时执行它们。 我尝试使用具有两个线程的线程池,但是问题是数据库任务很快完成,但是发送推送通知需要一些时间。 因此,当一个任务完成而另一个任务仍未完成时,它将引发异常。 我的代码

  • 我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况 我已经完成了第一部分——构建对象——的工作。我现在的问题是- 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个 我怎样才能在