这些从循环开始的线程是否异步执行?

时间:2019-04-15 16:53:23

标签: java multithreading concurrency

我的数据量很大,所以我考虑将其分成多个块,并使用线程异步处理它。 为了简单起见,假设我有一个列表,并将每个条目与一个线程相关联,所以线程数等于元素数。由于我是Java线程的新手,因此我不确定线程​​如何异步运行。这是一个简化的代码,可以使您更好地理解。

class ThreadRunner extends Thread { 
  String threadName;
  String element;
  public MyThread (String threadName, String element) { 
    this.threadName = threadName;
    this.element = element;
  }

  public void run() { 
    System.out.println("Run: "+ threadName); 
    // some processing on the item
  } 
}


 class TestThread {
  public static void main (String arg[]) {
    List<String> mainList = new ArrayList<>();


    for (int x=0; x< mainList.size(); x++)
    {
        MyThread temp= new MyThread("Thread #" + x+1);
        temp.start();
        System.out.println("Started Thread:" + x+1);
    }
}

此代码是否以异步方式执行线程?

1 个答案:

答案 0 :(得分:0)

使用ExecutorService并以Runnable s的形式向其提交工作,而不是自己生成线程。

每个Runnable任务应处理足够的工作以证明产生线程的开销是合理的,但工作量不应太多,以致于未充分利用其他内核。换句话说,您想要适当地平衡内核之间的工作。一种方法是在任务之间平均划分元素,以便每个任务大致处理num_threads / mainList.size()个元素,然后将num_thread个任务提交到ExecutorService