创建n个线程

时间:2018-08-20 16:12:23

标签: java multithreading

我有一个java方法,我想创建n个线程,然后使每个线程打印出1到100之间的数字。

public void createThreads(int n){
    for (int i = 0; i < n; i++) {
        new Thread(() -> {
            for (int j = 0; j < 100; j++) {
                System.out.println(j);


            }
        });       
    }
}

无论何时运行此方法,即使传递参数,也不会打印任何内容。我该如何解决?

3 个答案:

答案 0 :(得分:4)

没有打印任何内容,因为您没有启动线程。

public Thread[] createThreads(int n) {
    final Thread[] threads = new Thread[n];

    for (int i = 0; i < n; ++i) {
        threads[i] = new Thread(this::doTask);
    }

    return threads;
}

private void doTask() {
    for (int j = 1; j <= 100; j++) {
        System.out.println(j);
    }
}

public void startThreads(Thread[] threads) {
    for (Thread thread : threads) {
        thread.start();
    }
}

还请注意,我已将for循环更改为public void createThreads(int n){ for (int i = 0; i < n; i++) { new Thread(() -> { for (int j = 1; j <= 100; j++) { System.out.println(j); } }).start(); // <-- .start() makes the thread start running } } ,因为其目的是打印从for (int j = 1; j <= 100; j++)1的数字(而不是从100到{ {1}}。

答案 1 :(得分:3)

仅创建线程是不够的,您还需要start

new Thread(() -> { ... }).start();

我建议在这里进行一些重构。

我希望从名称为createThreads的方法返回创建的线程-Thread[] createThreads(int n)(1)。

该代码不容易阅读-将Thread的{​​{1}}移到单独的方法中将使其更清晰(2)。

如果您同时在方法中创建和启动线程(3),则名称Runnable将变得不正确。将其重命名为createThreads或创建两个单独的方法createAndStartThreadscreateThreads,因为a method should take a single responsibility更可取。

startThreads

答案 2 :(得分:0)

这是我创建N个线程的工作。  如果您要指定自己的名称,这里提到的方法截然不同  线程。

1. Thread T[] = new Thread[list.size()];
2. for (int i = 0; i < list.size(); i++) {
3.     T[i] = new Thread(new constructor_name());
4.     T[i].setName(list.get(i));
5.     T[i].start();
6. }

说明:

  1. 使用列表大小创建线程数组。
  2. 执行循环直到列表的最后一个元素。
  3. 在循环内启动,分配和启动线程。

线程执行:

public void run() {        
    try {
         method_name(Thread.currentThread().getName());
    } catch (Exception ex) {
         System.out.println(ex.getMessage());
    }
 }

注意:这里对列表的每个元素同步调用method_name(thread_parameter)。