Groovy - 创建线程
在 Groovy 中创建线程有两种不同的方式。我们将它们列出如下:
- 通过实现 Runnable 接口
- 通过扩展 Thread 类
通过实现 Runnable 接口创建线程
如果您的 class 打算作为线程执行,那么可以通过实现 Runnable 接口来实现这一点。您需要遵循以下三个基本步骤 −
步骤 1
作为第一步,您需要实现 Runnable 接口提供的 run() 方法。此方法为线程提供了入口点,您将把完整的业务逻辑放入此方法中。以下是 run() 方法的简单语法 −
void run( )
步骤 2
作为第二步,您将使用以下构造函数实例化一个 Thread 对象 −
Thread(Runnable threadObj, String threadName);
其中,threadObj 是实现 Runnable 接口的 class 的实例,threadName 是赋予新线程的名称。
步骤 3
创建 Thread 对象后,您可以通过调用 start() 方法启动它,该方法会执行对 run() 方法的调用。以下是 start() 方法的简单语法 −
void start();
示例 - 通过实现 Runnable 接口创建线程
在这个示例中,我们通过实现 Runnable 接口创建了一个名为 RunnableDemo 的 class。RunnableDemo class 实现了 run() 方法。在主类 TestThread 中,我们创建了 RunnableDemo 对象,并使用这些对象创建了两个 Thread 对象。当对每个线程对象调用 Thread.start() 方法时,线程开始处理并执行程序。
Example.groovy
class Example {
static void main(String[] args) {
RunnableDemo runnableDemo1 = new RunnableDemo( "Thread-1");
RunnableDemo runnableDemo2 = new RunnableDemo( "Thread-2");
Thread thread1 = new Thread(runnableDemo1);
Thread thread2 = new Thread(runnableDemo2);
thread1.start();
thread2.start();
}
}
class RunnableDemo implements Runnable {
private String threadName;
RunnableDemo( String name) {
threadName = name;
println("Thread: " + threadName + ", " + "State: New"); // 状态:新建
}
void run() {
println("Thread: " + threadName + ", " + "State: Running"); // 状态:运行中
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
}
println("Thread: " + threadName + ", " + "State: Dead"); // 状态:已终止
}
}
输出
上述程序产生以下输出 −
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: Thread-1, State: Running Thread: Thread-2, State: Running Thread: Thread-1, 4 Thread: Thread-2, 4 Thread: Thread-1, 3 Thread: Thread-2, 3 Thread: Thread-1, 2 Thread: Thread-2, 2 Thread: Thread-1, 1 Thread: Thread-2, 1 Thread: Thread-1, State: Dead Thread: Thread-2, State: Dead
通过扩展 Thread 类创建线程
创建线程的第二种方式是创建一个扩展 Thread class 的新 class,使用以下两个简单步骤。这种方法在使用 Thread class 中的可用方法创建多个线程时提供了更大的灵活性。
步骤 1
您需要重写 Thread class 中的 run() 方法。此方法为线程提供了入口点,您将把完整的业务逻辑放入此方法中。以下是 run() 方法的简单语法 −
void run( )
步骤 2
创建 Thread 对象后,您可以通过调用 start() 方法启动它,该方法会执行对 run() 方法的调用。以下是 start() 方法的简单语法 −
void start( );
示例 - 通过扩展 Thread 类创建线程
以下是将前述程序重写为扩展 Thread 的版本 − 在此示例中,我们创建了一个扩展 Thread 类的 ThreadDemo 类。我们在 constructor() 方法中调用 super(name) 为线程分配名称,并调用 super.start() 来启动线程处理。
Example.groovy
class Example {
static void main(String[] args) {
ThreadDemo thread1 = new ThreadDemo( "Thread-1");
ThreadDemo thread2 = new ThreadDemo( "Thread-2");
thread1.start();
thread2.start();
}
}
class ThreadDemo extends Thread {
ThreadDemo( String name) {
super(name);
println("Thread: " + name + ", " + "State: New");
}
void run() {
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
for(int i = 4; i > 0; i--) {
println("Thread: " + Thread.currentThread().getName() + ", " + i);
}
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
}
void start () {
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start");
super.start();
}
}
输出
上述程序将产生以下输出 −
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: main, State: Start Thread: main, State: Start Thread: Thread-1, State: Running Thread: Thread-2, State: Running Thread: Thread-2, 4 Thread: Thread-1, 4 Thread: Thread-2, 3 Thread: Thread-1, 3 Thread: Thread-2, 2 Thread: Thread-1, 2 Thread: Thread-2, 1 Thread: Thread-1, 1 Thread: Thread-2, State: Dead Thread: Thread-1, State: Dead
示例 - 演示 sleep() 方法
在此示例中,我们展示了 sleep() 方法 的使用,用于延迟处理。这有助于在输出中展示并行处理。我们在 run 方法中添加了 Thread.sleep() 调用。InterruptedException 被处理,因为线程在 sleep 模式期间可能被中断。
class Example {
static void main(String[] args) {
ThreadDemo thread1 = new ThreadDemo( "Thread-1");
ThreadDemo thread2 = new ThreadDemo( "Thread-2");
thread1.start();
thread2.start();
}
}
class ThreadDemo extends Thread {
ThreadDemo( String name) {
super(name);
println("Thread: " + name + ", " + "State: New");
}
void run() {
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
for(int i = 4; i > 0; i--) {
println("Thread: " + Thread.currentThread().getName() + ", " + i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
}
void start () {
println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start");
super.start();
}
}
输出
上述程序将产生以下输出 −
Thread: Thread-1, State: New Thread: Thread-2, State: New Thread: main, State: Start Thread: main, State: Start Thread: Thread-1, State: Running Thread: Thread-2, State: Running Thread: Thread-1, 4 Thread: Thread-2, 4 Thread: Thread-2, 3 Thread: Thread-1, 3 Thread: Thread-1, 2 Thread: Thread-2, 2 Thread: Thread-1, 1 Thread: Thread-2, 1 Thread: Thread-1, State: Dead Thread: Thread-2, State: Dead