创建 java.lang.Thread 实例

在 Java 中创建线程有两种主要方法。实质上,创建一个线程就像编写将在其中执行的代码一样简单。这两种方法在定义代码的位置上有所不同。

在 Java 中,线程由对象表示 - java.lang.Thread 的实例或其子类。所以第一种方法是创建该子类并覆盖 run() 方法。

注意 :我将使用 Thread 来引用 java.lang.Thread 类和线程来引用线程的逻辑概念。

class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread running!");
        }
    }
}

既然我们已经定义了要执行的代码,那么可以将线程创建为:

MyThread t = new MyThread();

线程类还包含一个构造函数接受一个字符串,将被用作线程的名字。在调试多线程程序时,这可能特别有用。

class MyThread extends Thread {
    public MyThread(String name) {
        super(name);
    }
    
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("Thread running! ");
        }
    }
}

MyThread t = new MyThread("Greeting Producer");

第二种方法是使用 java.lang.Runnable 定义代码,它的唯一方法是 run() 。然后, Thread 类允许你在分离的线程中执行该方法。要实现此目的,请使用接受 Runnable 接口实例的构造函数创建线程。

Thread t = new Thread(aRunnable);

当与 lambdas 或方法引用结合使用时,这可能非常强大(仅限 Java 8):

Thread t = new Thread(operator::hardWork);

你也可以指定线程的名称。

Thread t = new Thread(operator::hardWork, "Pi operator");

实际上,你可以毫无后顾之忧地使用这两种方法。然而,一般的智慧说使用后者。

对于所提到的四个构造函数中的每一个,还有一个替代方法是接受 java.lang.ThreadGroup 的实例作为第一个参数。

ThreadGroup tg = new ThreadGroup("Operators");
Thread t = new Thread(tg, operator::hardWork, "PI operator");

线程组表示一组线程。你只能使用 Thread的构造函数将 Thread添加到 ThreadGroup 。该线程组则可以用来管理其所有线程小号一起,还有线程可以从中取得信息线程组

所以为了 sumarize,可以使用以下公共构造函数之一创建 Thread

Thread()
Thread(String name)
Thread(Runnable target)
Thread(Runnable target, String name)
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)

最后一个允许我们为新线程定义所需的堆栈大小。

在创建和配置具有相同属性或来自相同模式的许多线程时,代码可读性通常会受到影响。那时可以使用 java.util.concurrent.ThreadFactory 。此接口允许你通过工厂模式及其唯一方法 newThread(Runnable) 封装创建线程的过程。

class WorkerFactory implements ThreadFactory {
    private int id = 0;

    @Override
    public Thread newThread(Runnable r) {
        return new Thread(r, "Worker " + id++);
    }
}