- Runnable接口是什么?
在Java中,Runnable接口是一个功能性接口,它用于定义运行在线程中的代码块。当一个类实现了Runnable接口,它必须实现run()方法,这个方法定义了线程需要执行的代码块。
通常情况下,我们都使用Thread类来创建线程,但是Thread类只能继承一个类,这就意味着如果我们的类已经继承了其他类,就不能再继承Thread类。此时,我们可以通过实现Runnable接口来创建线程。这种方式也可以避免Java多继承给出的问题。
- 如何实现一个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:在主线程中创建新线程并执行
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接口,我们可以方便地实现多线程编程,更好地利用计算机的多核处理能力。