java 多个任务,但在单独的线程中并发运行

czq61nw1  于 2023-02-02  发布在  Java
关注(0)|答案(2)|浏览(151)

我遇到了一些挑战,我只是想确认我的知识是正确的。
你打算如何实现这一点?
例如,如果你的程序是用Java编写的,那么ERATOSTHENES测试应该在一个线程中运行,而蛮力测试应该在另一个线程中同时运行。最后,你的程序应该向屏幕报告基准测试的结果,然后退出。
是这样吗?

class TestMultitasking4{  
 public static void main(String args[]){  
  Thread t1=new Thread(){  
    public void run(){  
      System.out.println("task one");  
    }  
  };  
  Thread t2=new Thread(){  
    public void run(){  
      System.out.println("task two");  
    }  
  };  
  
  
  t1.start();  
  t2.start();  
 }  
}
eqqqjvef

eqqqjvef1#

这是不正确的。如果你运行程序,它只会启动2个线程,然后立即退出,因为你的主线程不会等待t1和t2的终止。
您应该:

  • 收集线程的结果(您需要可调用和future)
  • 等待线程终止(Thread.join是原语)

有很多方法可以在不直接使用线程的情况下使用更高级的抽象来实现这一点。

public static void main(String[] args) {
    CompletableFuture<Boolean> future1 = CompletableFuture.supplyAsync(() -> isPrime(42));
    CompletableFuture<String> future2 =  CompletableFuture.supplyAsync(() -> bruteForcePassword("encrypted"));

    var prime = future1.join();
    var pwd = future2.join();

    System.out.println("Was prime:" + prime);
    System.out.println("Password:" + pwd);
}

private static String bruteForcePassword(String s) {
    return "Alph@Rome0";
}

private static boolean isPrime(long value) {
    return false;
}
vbopmzt1

vbopmzt12#

您的方法是正确的,尽管您可能希望通过在方法内部扩展Thread来避免创建匿名类。
下一步是测量Runnable内的运行时间,并使用Thread.join()等待线程完成,以便显示结果。确保使用System.nanoTime()方法,而不是currentTimeMillis()see here why
如果您想进一步探索Java标准库,请查看java.util.concurrent包中的内容,例如java.util.concurrent.ExecutorService

相关问题