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

使用线程执行多项任务,但每个任务都没有线程

方航
2023-03-14

我有一个类,它基本上会做两次相同的步骤。听起来像是一个在哪里多线程处理程序的完美例子。我的问题是,如果我只需要两个线程就可以做到这一点。以下是一般情况

Tester implements Runnable{
    Thread obj1Thread, obj2Thread;
    MyObj obj1, obj2;
    String obj1Results, obj2Results;

    void runTests(){
        obj1Thread = new Thread(this, "ob1 thread");
        obj2Thread = new Thread(this, "ob2 thread");
        obj1.start();//builds up obj1
        obj2.start();//builds up obj2
        if(obj1 and obj2 are finished building){
            System.out.println(obj1);
            System.out.println(obj2);
        }
        obj1Thread.startSecondPhase()//runs a separate function that tests obj1 vs ob2. Essentially test(ob1, ob2)
        obj2Thread.startSecondPhase()//runs a separate function that tests obj2 vs ob1. Essentially test(ob2, ob1)
        if(obj1 and obj2 are finished testing){
            System.out.println(obj1Results);
            System.out.println(obj2Results);
        }     
    }
}

我已经完成了第一部分——构建对象——的工作。我现在的问题是-

  1. 如何让主线程等待两个线程完成其第一部分?也许main会在两个对象上执行等待,然后在线程notifyAll之后,它们会在主线程上执行等待?但是线程如何抓住主线程呢?也许用这个
  2. 我怎样才能在不使用新线程和新的特定运行函数创建新类的情况下获得运行函数的这个“第二阶段”?我不想为了每一个小任务都去上新课

要明确我想要的事件顺序是-

  1. 主线程初始化并启动两个线程

编辑:还有,我如何告诉特定线程我希望它们处理哪些对象?现在我正在用一种黑客的方式做这件事(我正在使用线程名称)。

共有1个答案

戚星腾
2023-03-14

我会使用更高级的抽象:使用execute和ExecutorService。invokeAll(集合

你的主线可以

  1. 派遣两个任务,
  2. 获得两个未来,
  3. 打印结果,然后
  4. 再派两个任务

执行人服务和期货将在后台处理所有并发操作。

编辑:

我看到你的评论:

一个只实现一行代码的特殊可运行类?也许我太理想化了,但我觉得这不对。

在这种情况下,您通常使用ananymous内部类:

Future future = executorService.submit(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});

这没什么错。当Java拥有lambda时,它将变得更短。

  Future future = executorService.submit(() -> {System.out.println("Asynchronous task");});
 类似资料:
  • 主要内容:1 如何使用多个线程执行一个任务,2 如何使用多个线程执行多个任务1 如何使用多个线程执行一个任务 如果需要由多个线程执行单个任务,则只有一个run()方法,例如: 1.1 多个线程执行一个任务示例1 输出结果为: 1.2 多个线程执行一个任务示例2 输出结果为: 注意:每个线程在单独的堆栈中运行。 2 如何使用多个线程执行多个任务 如果必须通过多个线程执行多个任务,请使用多个run() 方法: 2.1 多个线程执行多个任务示例1 输出结果为: 2.2 多个线程

  • 本文向大家介绍Java 使用线程池执行多个任务的示例,包括了Java 使用线程池执行多个任务的示例的使用技巧和注意事项,需要的朋友参考一下 在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率。线程池包含了一系列的线程,并且可以管理这些线程。例如:创建线程,销毁线程等。本文将介绍如何使用Java中的线程池执行任务。 1 任务类型 在使用线程池执行任务

  • 多任务是一个操作系统可以同时执行多个程序的能力。基本上,操作系统使用一个硬件时钟为同时执行的每个程序配置「时间片段」。如果时间片段够小,并且机器也没有由于太多的程序而超出负荷时,那么在使用者看来,所有的这些程序似乎在同时执行着。 多任务并不是什么新的东西。在大型计算机上,多任务是必然的。这些大型主机通常有几十甚至几百个终端机和它连结,而每个终端机使用者都应该感觉到他或者她独占了整个计算机。另外,大

  • 问题内容: 我是python和线程的新手。我已经编写了充当网络爬虫的python代码,并在网站中搜索特定的关键字。我的问题是,如何使用线程同时运行类的三个不同实例。当实例之一找到关键字时,所有三个实例都必须关闭并停止爬网。这是一些代码。 如何使用线程让Crawler同时执行三个不同的爬网? 问题答案: 似乎没有一种(简单的)方法可以终止Python中的线程。 这是一个并行运行多个HTTP请求的简单