如何大约同时运行两个操作?

时间:2016-02-03 18:07:28

标签: java multithreading thread-safety

我在java中构建测试工具,并尝试比较两个解析器的性能和延迟。分析来自实时单一馈送的数据。我无法控制Feed,也没有#34;模拟Feed"为了模拟数据,所以为了比较苹果和苹果,我想尽可能同时运行我的解析。我是java和线程的新手,所以我不确定这是不是最好的方法。我的想法是旋转2个线程:

SomeFeed feed = new SomeFeed();

Thread thread1 = new Thread () {
  public void run () {
    parser1.parseFeed(feed);
  }
};
Thread thread2 = new Thread () {
  public void run () {
    parse2.parseFeed(feed);
  }
};
thread1.start();
thread2.start();

线程以这种方式运行会大致同步运行吗?或者有更好的方法吗?

由于

3 个答案:

答案 0 :(得分:1)

让两个线程完全并行运行并不是你真正可以控制的东西。但如果您同时关心开始几乎),您可以使用CyclicBarrier(取自here):

// We want to start just 2 threads at the same time, but let's control that 
// timing from the main thread. That's why we have 3 "parties" instead of 2.
final CyclicBarrier gate = new CyclicBarrier(3);

Thread t1 = new Thread(){
    public void run(){
        gate.await();
        //do stuff    
    }};
Thread t2 = new Thread(){
    public void run(){
        gate.await();
        //do stuff    
    }};

t1.start();
t2.start();

// At this point, t1 and t2 are blocking on the gate. 
// Since we gave "3" as the argument, gate is not opened yet.
// Now if we block on the gate from the main thread, it will open
// and all threads will start to do stuff!

gate.await();
System.out.println("all threads started");

这将使您最接近同时启动它们。

答案 1 :(得分:1)

这是一种做事方式。其他方法是实现Runnable接口

public class SomeFeed implements Runnable {

    public void run() {
        System.out.println("Hello from a thread!");
    }

    public static void main(String args[]) {
        (new Thread(new SomeFeed())).start();
    }

}

新方法是使用ThreadPool。

这是您创建池并执行代码的方式

ExecutorService pool = Executors.newFixedThreadPool(2);

for(int i = 0; i < 2; i++){
   pool.submit(new SomeFeed());


}

确保SomeFeed实现可调用接口。

可以找到更多信息here

答案 2 :(得分:0)

无论您遇到单个Feed问题,同时运行解析器都是比较它们的最差方式。

将Feed放在一边,成为两个测试的参考数据集。

你需要至少测量它们所花费的时间,而CPU却没有干扰地使用它。

并且您还应该执行超过1500次运行以更好地计算例程所需的平均时间(1500个方法调用是加速代码的热点JIT编译的阈值)。此外,尝试至少使代码运行超过30秒,以便平均潜在的操作系统和磁盘变化干扰。

如果您注意到GC暂停(在基准测试期间始终启用gc日志),那么您必须在更多内存中运行测试以避免完整gc(例如使用-Xmx2G),或者经常运行测试两个解析器中完整GC的数量相当相等。

无论如何,内存滥用,因此GC时间也是判断最差解析器的性能因素。