java—如何创建n个线程并使用所有线程

vu8f3i0k  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(457)

我试图创建一个给定数量的线程,并处理他们在同一时间,使一个“种族”的程序。线程被创建了,但我做错了什么,因为任何线程打印“嗨”。

public class Principal implements Runnable{

    public static void main(String[] args) {

        int howManyThreads = 3;
        Thread thread[];

        thread = new Thread[howManyThreads];

        for ( int i=0; i < thread.length; i++ ){

            thread[i]= new Thread();
            thread[i].setName("Thread - " + i);
        }

        for ( int i=0; i < thread.length; ++i){

            thread[i].start();
            System.out.println(thread[i].getName() + " - " + thread[i].getState());
        }

    }

    public void run() {

        System.out.println("Hi");
    }
}
91zkwejq

91zkwejq1#

的默认构造函数 Thread 类创建一个不执行任何操作的线程。在这里调用默认构造函数: thread[i] = new Thread(); 如果希望线程实际执行某些操作,那么必须提供 Runnable 示例作为线程构造函数的参数。有几种方法可以做到这一点。最新、最简洁的方法是使用lambda表达式:

thread[i] = new Thread(() -> {
    System.out.println("Hi");
});

这个 Runnable 接口是一个 @FunctionalInterface . 因为编译器知道 Thread(...) 构造函数想要一个该类型的对象,它推断lambda应该创建这个对象,lambda的主体成为 run() 新对象的方法。
另一种更古老的方式 Runnable 对象将使用匿名内部类表达式。语法有点麻烦,因为您必须显式地说明新类应该实现什么接口,并且必须显式地声明 run() 方法:

thread[i] = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hi");
    }
});

最古老的方法(更详细)是显式声明命名类:

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Hi");
    }
};

public class Principal /*does not need to implement Runnable*/ {
    ...
    thread[i] = new Thread(new MyRunnable());
    ...
}

你可能会问,我为什么要搬走 implements RunnablePrincipal 类,并创建一个全新的类?
我这么做是因为,我读过这本书:https://www.amazon.com/clean-code-handbook-software-craftsmanship/dp/0132350882/

相关问题