欢迎访问宙启技术站
智能推送

在Java中如何实现多线程?

发布时间:2023-06-24 13:24:04

在 Java 中,实现多线程可以使用线程类或者实现 Runnable 接口来定义线程并实现多线程功能。基于线程类和 Runnable 接口的方式都是确定的 Java 标准,并且在几乎所有的操作系统和编程平台中都可以使用。下面将分别详细介绍。

一、线程类

Java 中的线程类是 Thread。在使用线程类来实现多线程时,我们需要继承 Thread 类并且覆盖类中的 run() 方法。在定义一个线程类之后,我们可以使用 start() 方法来启动该线程,Java 底层会自动调用 run() 方法。

线程类的代码示例:

public class MyThread extends Thread {
    public void run() {
        // 线程执行的代码
    }
}

在启动一个 MyThread 的实例时,我们可以使用如下代码:

MyThread thread = new MyThread();
thread.start();

在这个例子中,我们继承了 Thread 类并且覆盖了 run() 方法。这个例子中的 run() 方法是同步执行的,线程结束后代码也随之结束。

二、实现 Runnable 接口

除了使用继承 Thread 类的方法,我们还可以使用实现 Runnable 接口的方法来创建多线程。对于某些情况,使用实现 Runnable 接口的方法比继承 Thread 类更加有优势,因为 Java 可以支持在实现 Runnable 接口之外还可以继承类和实现其它接口。

Runnable 接口包含一个方法 run(),在实现 Runnable 接口时需要实例化 Thread 类并且传入实现了 Runnable 接口的类的实例。在启动线程时,我们可以调用 Thread 的 start() 方法,它会自动执行 Runnable 接口中的 run() 方法。

示例代码:

public class MyRunnable implements Runnable {
    public void run() {
        // 线程执行的代码
    }
}

MyRunnable myRunnable = new MyRunnable();
Thread t = new Thread(myRunnable);
t.start();

在这个例子中,我们实现了 Runnable 接口,并且将 MyRunnable 的实例传递给 Thread 类的构造器。在启动线程时,我们使用 start() 方法,它会自动调用 MyRunnable 的 run() 方法。

三、线程状态

线程在执行的过程中会经历生命周期中的不同状态。可用的状态包括:

- New:当线程被实例化但没有被启动时,它的状态就是 New。

- Runnable:当线程被启动以后它就处在了 Runnable 状态。在运行时它可能处在了 Running,Waitting 或 Blocked 的状态。

- Running:当线程得到了 CPU 资源并正在执行时它的状态就是 Running。

- Waiting:当线程等待某些其它线程释放锁的时候,它的状态就是 Waiting。线程也可以在某个对象上等待其他线程的通知。

- Blocked:当线程需要获取某个锁而该锁被其他线程占用时,它的状态就是 Blocked。

- Dead:当线程的 run() 方法结束时,它的状态就是 Dead。

使用一些方法可用监控线程的状态。方法有:

- isAlive():Thread 类中的方法可以检查线程是否处于 alive 状态,也就是 Runnable 或是 Running。

- join():Thread 类中的方法,等待线程结束。调用 join() 方法之后,当前线程会一直阻塞等待目标线程运行结束。

- sleep():Thread 类中的方法,使线程进入阻塞状态进行休眠。该方法会暂停当前线程指定的毫秒数,然后重新启动该线程。

- yield():Thread 类中的方法,暂停当前线程来允许其他线程运行,自己会进入就绪状态。

总之,在Java中,实现多线程可以使用线程类或实现 Runnable 接口来定义线程,通过不同状态的监控方法即可了解线程的状态。