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

Java 使用线程执行多项任务,但每个任务都没有线程,java,multithreading,synchronization,Java,Multithreading,Synchronization,我有一个类,它基本上做了两次相同的步骤。听起来像是一个完美的例子,说明了在哪里对程序进行多线程处理。我的问题是,如果我能做到这一点,只有两个线程。以下是一般情况 Tester implements Runnable{ Thread obj1Thread, obj2Thread; MyObj obj1, obj2; String obj1Results, obj2Results; void runTests(){ obj1Thread = new

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

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);
        }     
    }
}
我已经得到了第一部分-建立对象-工作。我现在的问题是:

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

  • 主线程初始化并启动两个线程
  • 两个线程同时构建各自的对象
  • 当两个线程都完成构建时,它们会暂停。然后主线程按顺序打印对象
  • 主线程完成后,两个线程同时将代码继续到测试阶段
  • 线程完成后,主线程将打印结果。可能在此处使用
    join()

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

    我会使用更高级的抽象:使用execute和
    ExecutorService.invokeAll(Collection1-2-您可以使用某种标志来告诉
    线程
    /
    可运行
    您所说的运行函数中有
    if/else
    if(buildComplete)的运行状态做测试?我更喜欢一个更有说服力的解决方案,但我想如果没有其他解决方案的话,这是可行的。然后使用两个
    可运行的
    ,一个用于构建,一个用于测试-但是你说你不想这样做…是的,但只是因为我觉得这是一种浪费和丑陋的代码。一个特殊的
    可运行的
    类只是为了实现基本上是一行代码吗?也许我太理想化了,但我觉得这不对。你可以在两个线程中使用
    CountDownLatch
    (主线程将在其上阻塞),一旦你添加到计数(在线程中),你可以锁定另一个主线程随后更新的监视器锁(例如,您可以使用第二个
    CountDownLatch
    设置为1)…这意味着您将得到3个
    倒计时锁存
    ,构建、等待和测试…+1以使用
    ExecutorService
    。嗯,我不认为将这两个任务分为不同的类有什么问题,但那只是我对
    ExecutorService
    的东西不太熟悉,你知道是哪种实现吗我应该使用ng类?我认为
    线程池可以,但我不是100%确定。@Dgrin91是的。我想
    执行器。newFixedThreadPool(2)
    应该可以工作。另外,我会进行基准测试以确保多线程版本实际上更快;)@我使用了ewernli,速度快了约30%。而
    newFixThreadPool
    就是我最终使用的。
    Future future = executorService.submit(new Runnable() {
        public void run() {
            System.out.println("Asynchronous task");
        }
    });
    
      Future future = executorService.submit(() -> {System.out.println("Asynchronous task");});