Java 这些从循环启动的线程是否异步执行?
我的数据量很大,所以我考虑将其划分为块,并使用线程异步处理它。 为了简单起见,假设我有一个列表,并将每个条目与一个线程相关联,因此线程的数量等于元素的数量。因为我是Java线程新手,所以我不确定线程是如何异步运行的。下面是一个简化的代码,以便更好地理解Java 这些从循环启动的线程是否异步执行?,java,multithreading,concurrency,Java,Multithreading,Concurrency,我的数据量很大,所以我考虑将其划分为块,并使用线程异步处理它。 为了简单起见,假设我有一个列表,并将每个条目与一个线程相关联,因此线程的数量等于元素的数量。因为我是Java线程新手,所以我不确定线程是如何异步运行的。下面是一个简化的代码,以便更好地理解 class ThreadRunner extends Thread { String threadName; String element; public MyThread (String threadName, String el
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个元素。而且你看不到任何打印消息的交错。你应该在循环中的某个地方有一个日志来处理这些元素?