Java中的Runnable接口是什么?

  • Post category:Java
  1. Runnable接口是什么?

在Java中,Runnable接口是一个功能性接口,它用于定义运行在线程中的代码块。当一个类实现了Runnable接口,它必须实现run()方法,这个方法定义了线程需要执行的代码块。

通常情况下,我们都使用Thread类来创建线程,但是Thread类只能继承一个类,这就意味着如果我们的类已经继承了其他类,就不能再继承Thread类。此时,我们可以通过实现Runnable接口来创建线程。这种方式也可以避免Java多继承给出的问题。

  1. 如何实现一个Runnable接口?

我们可以通过以下步骤实现一个Runnable接口:

1) 定义实现了Runnable接口的类。

public class MyRunnable implements Runnable {
    public void run() {
        System.out.println("MyRunnable is running");
    }
}

2) 创建Runnable实例

MyRunnable myRunnable = new MyRunnable();

3) 创建Thread实例,并将Runnable实例传递给Thread构造器

Thread thread = new Thread(myRunnable);

4) 启动线程

thread.start();

这个例子中,MyRunnable实现了Runnable接口,并重写了run()方法。在main()方法中,首先创建了MyRunnable实例myRunnable,然后将其传递给Thread构造器,创建了Thread实例thread。当调用thread.start()后,JVM会在背后创建一个新的线程,并执行MyRunnable实例中的run()方法。此时,控制台会输出“MyRunnable is running”的信息。

我们也可以使用Lambda表达式来创建Runnable实现。例如:

Runnable runnable = () -> {
    System.out.println("Runnable is running");
};

这个例子中,我们直接通过Lambda表达式来定义了一个Runnable实例,并实现了run()方法。

  1. 实例说明

下面,我们来看一下两个实例说明:

实例1:在主线程中创建新线程并执行

public class Main {
    public static void main(String[] args) {
        System.out.println("Main thread is running");

        // 创建Runnable实例
        Runnable runnable = () -> {
            System.out.println("New thread is running");
        };

        // 创建Thread实例
        Thread thread = new Thread(runnable);

        // 启动新线程
        thread.start();
    }
}

当我们执行这个程序时,会看到两个输出信息:

Main thread is running
New thread is running

这个例子中,我们在主线程中创建了一个新的线程,并执行了定义在Runnable实例中的代码块。

实例2:多线程之间的通信

public class Main {
    public static void main(String[] args) {
        // 共享资源
        SharedResource sharedResource = new SharedResource();

        // 创建两个线程,分别进行读操作和写操作
        Thread readThread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                sharedResource.read();
            }
        });

        Thread writeThread = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                sharedResource.write();
            }
        });

        // 启动两个线程
        readThread.start();
        writeThread.start();
    }
}

class SharedResource {
    private int value = 0;
    private boolean isWriting = false;

    // 读操作
    public void read() {
        while (isWriting) {
            // 如果正在写,则等待
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 读取共享资源
        System.out.println("Read value: " + value);
    }

    // 写操作
    public synchronized void write() {
        isWriting = true;

        // 写入共享资源
        value++;

        isWriting = false;
    }
}

这个例子中,我们创建了一个SharedResource类,它封装了一个int类型的共享资源value和一个boolean类型的标记isWriting。我们创建了两个线程,一个进行读操作,另一个进行写操作。在读操作中,我们使用while循环来等待写操作的完成,从而实现了多线程间的同步操作。

以上就是对Runnable接口的详细讲解和两个实例的说明。通过Runnable接口,我们可以方便地实现多线程编程,更好地利用计算机的多核处理能力。