为了账号安全,请及时绑定邮箱和手机立即绑定

创建 n 个线程

创建 n 个线程

30秒到达战场 2021-08-04 09:54:29
我有一个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 回答

?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

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


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 循环更改为for (int j = 1; j <= 100; j++),因为目的是从1to打印数字100(而不是从0to 99)。


查看完整回答
反对 回复 2021-08-04
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

创建线程是不够的,您还需要启动它们。


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

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


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


该代码是不容易读取-移动Thread的Runnable到一个单独的方法将使其更清晰(2)。


createThreads如果您在方法中同时创建和启动线程 (3) ,名称就会变得不准确。将其重命名为createAndStartThreads或创建两个单独的方法createThreads,startThreads这是更可取的,因为方法应该承担单一责任。


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();

    }

}


查看完整回答
反对 回复 2021-08-04
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

这就是我为创建 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. }

解释:


使用您的列表大小创建线程数组。

执行循环直到列表的最后一个元素。

在循环内启动、分配和启动线程。

线程的执行:


public void run() {        

    try {

         method_name(Thread.currentThread().getName());

    } catch (Exception ex) {

         System.out.println(ex.getMessage());

    }

 }

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


查看完整回答
反对 回复 2021-08-04
  • 3 回答
  • 0 关注
  • 182 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信