我有一个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);
}
});
}
}
无论何时运行此方法,即使传递参数,也不会打印任何内容。我该如何解决?
答案 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
或创建两个单独的方法createAndStartThreads
和createThreads
,因为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. }
说明:
线程执行:
public void run() {
try {
method_name(Thread.currentThread().getName());
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
}
注意:这里对列表的每个元素同步调用method_name(thread_parameter)。