Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这些从循环启动的线程是否异步执行?_Java_Multithreading_Concurrency - Fatal编程技术网

Java 这些从循环启动的线程是否异步执行?

Java 这些从循环启动的线程是否异步执行?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我的数据量很大,所以我考虑将其划分为块,并使用线程异步处理它。 为了简单起见,假设我有一个列表,并将每个条目与一个线程相关联,因此线程的数量等于元素的数量。因为我是Java线程新手,所以我不确定线程是如何异步运行的。下面是一个简化的代码,以便更好地理解 class ThreadRunner extends Thread { String threadName; String element; public MyThread (String threadName, String el

我的数据量很大,所以我考虑将其划分为块,并使用线程异步处理它。 为了简单起见,假设我有一个列表,并将每个条目与一个线程相关联,因此线程的数量等于元素的数量。因为我是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);
    }
}

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

使用ExecutorService并以可运行文件的形式向其提交工作,而不是自己生成线程


每个可运行的任务都应该处理足够的工作,以证明生成线程的开销是合理的,但不会有太多的工作导致您未充分利用其他核心。换句话说,您希望在整个内核中正确地平衡工作负载。实现这一点的一种方法是将元素均匀地划分到任务中,以便每个任务大致处理num_threads/mainList.sizeelements,然后您将num_thread任务提交给ExecutorService。

您认为为什么会这样?你为什么不这么认为?你是否以这种或那种方式收集了任何证据?我尝试过运行,但线程是同步运行的。例如,如果我们修改上述代码,使每个线程处理2个元素。然后,第二个线程在第一个线程完成后运行。那么,我的逻辑中有什么错误吗?也许可以添加更多的元素。目前,我在每个线程中有大约4000个元素。而且你看不到任何打印消息的交错。你应该在循环中的某个地方有一个日志来处理这些元素?