Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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_Runnable - Fatal编程技术网

在特定时间为Java创建多个线程

在特定时间为Java创建多个线程,java,multithreading,runnable,Java,Multithreading,Runnable,在5秒内创建500.000个线程的最佳方法是什么。(Runnable)我创建了for循环,但它需要很多时间。比如, startTime = System.currentTimeMills(); for (int i=0;i<500.000; i++){ // create thread thread.start(); } resultTime = (System.currentTimeMills() - startTime); startTime=System.currentT

在5秒内创建500.000个线程的最佳方法是什么。(Runnable)我创建了for循环,但它需要很多时间。比如,

startTime = System.currentTimeMills();

for (int i=0;i<500.000; i++){
 // create thread
  thread.start();
}

resultTime = (System.currentTimeMills() - startTime);
startTime=System.currentTimeMills();

对于(int i=0;i我真的无法想象这是一个好主意。每个线程占用了合理的资源量(默认情况下,每个线程占用512k堆),因此即使创建了所有线程,JVM也会争夺资源


如果您需要500000个工作单元,我认为您最好将它们创建为
Runnable
s(而不是一次完成!),并将它们传递给一个调整到您的environment.machine的机器(例如,一个简单/简单的调整将是每个CPU一个线程)

也许您可以创建两个特殊线程,每个线程生成250000个线程。

创建多个任务的最快方法是使用ExecutorService

int processors = Runtime.getRuntime().availableProcessors();
ExecutorService es = Executors.newFixedThreadPool(processors);

long start = System.nanoTime();
int tasks = 500 * 1000;
for (int i = 0; i < tasks; i++) {
    es.execute(new Runnable() {
        @Override
        public void run() {
            // do something.
        }
    });
}
long time = System.nanoTime() - start;
System.out.printf("Took %.1f ms to create/submit %,d tasks%n", time / 1e6, tasks);
es.shutdown();

也许这是一个期望你的电脑吸烟更好: 概念:在每个核心之间共享工作

public class Example {

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(new ThreadCreator()).start();  // with 4 cores on your processor
        }
    }


}

class ThreadCreator implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 125000; i++) {
            new Thread().start();         // each core creating remaining thread
        }
    }
}
公共类示例{
公共静态void main(字符串[]args){
对于(int i=0;i<3;i++){
新线程(new ThreadCreator()).start();//处理器上有4个内核
}
}
}
类ThreadCreator实现Runnable{
@凌驾
公开募捐{
对于(int i=0;i<125000;i++){
new Thread().start();//每个核心创建剩余线程
}
}
}

只花了0,6毫秒!!

Mmm。也许您可以生成许多线程来执行此操作?:-)请注意,您的循环结束条件是
i<500.000
。在Java中,500.000被解释为
double
,这意味着您正在实例化
500
线程,而不是
500000
。在任何情况下,500k似乎不是一个合理的线程数量。你为什么需要这么多?我无法想象这会导致JVM进程中出现多少上下文切换。这是为了在超频处理器上测试液氮吗?为什么500000个线程的每秒上下文更改比50个线程的每秒上下文更改要多?感谢所有回复。我正在尝试开发负载测试脚本。目前为止最好的。[核心数]线程创建线程似乎做得更好。对于可交付代码来说,这不是一个好主意。我想这是某种测试或研究。不是对OP问题的回答。答案是;不要创建成百上千的线程,因为a)你的系统会崩溃b)它的效率非常低c)你不需要。问题在于线程的数目,你只有4-24个内核,而且它们只能如此快速地切换上下文。你如何创建它们并不重要。@PeterLawrey问这个问题已经很晚了,但现在我刚刚完成了这个答案,我脑子里有这个问题!当你说
Executors.newFixedThreadPool(处理器)
时,它不会只创建4个固定线程(假设有4个处理器)在任何时候?@user1739812正确,但您可以给它500K个任务,它会尽可能有效地将这些任务分配给线程。@user1739812值得记住的是,一旦所有CPU都忙了,添加更多线程可能会使应用程序变慢,而不是像某些人假设的那样变快。
public class Example {

    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            new Thread(new ThreadCreator()).start();  // with 4 cores on your processor
        }
    }


}

class ThreadCreator implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 125000; i++) {
            new Thread().start();         // each core creating remaining thread
        }
    }
}