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