在Java中创建线程有两种不同的方法,如下所示:
通过实现Runnable接口来创建线程
如果你希望你的类能够作为一个线程来执行,则可以通过实现Runnable接口来达到这一目的。你需要遵循以下三个基本步骤:
步骤 1
作为第一步,你需要实现由Runnable接口提供的run()方法。这个方法提供了线程的入口点,并且你将在其中放置你的业务逻辑。下面是run()方法的一个简单语法:
public void run()
步骤 2
作为第二步,你将使用以下构造函数实例化一个Thread对象:
Thread(Runnable threadObj, String threadName);
其中,threadObj是一个实现了Runnable接口的类的实例,threadName是给新线程命名的名字。
步骤 3
一旦创建了Thread对象,你可以通过调用start()方法来启动它,这会执行对run()方法的调用。下面是start()方法的一个简单语法:
void start();
通过实现Runnable接口创建线程的示例
在这个例子中,我们创建了一个名为RunnableDemo的类,该类实现了Runnable接口。RunnableDemo类具有run()方法的实现。在主类TestThread中,我们创建了RunnableDemo的对象,并使用这些对象创建了两个Thread对象。当在每个线程对象上调用Thread.start()方法时,线程开始处理并且程序被执行。
package com.tutorialspoint;
class RunnableDemo implements Runnable {
private String threadName;
RunnableDemo( String name) {
threadName = name;
System.out.println("Thread: " + threadName + ", " + "State: New");
}
public void run() {
System.out.println("Thread: " + threadName + ", " + "State: Running");
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
}
System.out.println("Thread: " + threadName + ", " + "State: Dead");
}
}
public class TestThread {
public 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();
}
}
输出
Thread: Thread-1, State: New
Thread: Thread-2, State: New
Thread: Thread-1, State: Running
Thread: Thread-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
通过扩展Thread类来创建线程
创建线程的第二种方式是创建一个新的类,该类扩展了Thread类。这种方法通过使用Thread类中可用的方法来处理多个线程,提供了更多的灵活性。
步骤 1
你需要覆盖Thread类中的run()方法。这个方法提供了线程的入口点,并且你将在其中放置你的全部业务逻辑。下面是run()方法的一个简单语法:
public void run()
步骤 2
一旦创建了Thread对象,你可以通过调用start()方法来启动它,这会执行对run()方法的调用。下面是start()方法的一个简单语法:
void start();
通过扩展Thread类创建线程的示例
下面的例子展示了通过扩展Thread类创建线程的方法。在这个例子中,我们创建了一个名为ThreadDemo的类,该类扩展了Thread类。我们在构造函数中调用super(name)来给线程命名,并且调用super.start()来启动线程处理。
package com.tutorialspoint;
class ThreadDemo extends Thread {
ThreadDemo( String name) {
super(name);
System.out.println("Thread: " + name + ", " + "State: New");
}
public void run() {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + i);
}
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
}
public void start () {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start");
super.start();
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo thread1 = new ThreadDemo( "Thread-1");
ThreadDemo thread2 = new ThreadDemo( "Thread-2");
thread1.start();
thread2.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-1, 4
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-2, State: Running
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-2, State: Dead
示例:演示sleep()方法
在这个例子中,我们将展示使用sleep()方法来延迟处理的过程。它有助于在输出中展示并行处理的情况。我们在run方法中添加了Thread.sleep()调用,并处理了InterruptedException,因为线程在休眠模式中可能会被中断。
package com.tutorialspoint;
class ThreadDemo extends Thread {
ThreadDemo( String name) {
super(name);
System.out.println("Thread: " + name + ", " + "State: New");
}
public void run() {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Running");
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + i);
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Dead");
}
public void start () {
System.out.println("Thread: " + Thread.currentThread().getName() + ", " + "State: Start");
super.start();
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo thread1 = new ThreadDemo( "Thread-1");
ThreadDemo thread2 = new ThreadDemo( "Thread-2");
thread1.start();
thread2.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-1, 4
Thread: Thread-2, State: Running
Thread: Thread-2, 4
Thread: Thread-2, 3
Thread: Thread-1, 3
Thread: Thread-1, 2
Thread: Thread-2, 2
Thread: Thread-2, 1
Thread: Thread-1, 1
Thread: Thread-1, State: Dead
Thread: Thread-2, State: Dead