最近突然想到一个问题:Runnable是如何允许我自定义执行内容而进行多线程处理的?
首先看使用Runnable创建多线程的方法:
1 Runnable runnable = new Runnable() {
2 @Override
3 public void run() {
4 System.out.println("hello~");
5 }
6 };
7 Thread thread = new Thread(runnable);
8 thread.run();
我们可以看到首先创建了一个Runnable接口实例,Runnable接口源代码如下:
1package java.lang;
2/*
3 * @author Arthur van Hoff
4 * @see java.lang.Thread
5 * @see java.util.concurrent.Callable
6 * @since JDK1.0
7*/
8public interface Runnable {
9 public abstract void run();
10}
可以看到的是在Runnable接口中只有一个run方法待用户定义。
当我们重写Runnable的run方法后,我们就有了一个完整的方法,然后通过Thread传入接口并使用run();
方法运行。
所以Thread包括了多线程执行的所有方法,而Runnable仅提供了一个供用户重写的接口。
回过头来,我们创建一个实例:
TestIF.java
该接口仅负责存储一个String字符串:
1public interface TestIF {
2 String str();
3}
Main.java
1public class Main {
2 public static void main(String[] args) {
3 //创建一个TestIF接口实例并返回
4 TestIF testIF = IF();
5 //传递给另一个方法并输出
6 PrintIF(testIF);
7 }
8
9 public static TestIF IF() {
10 TestIF testIF = new TestIF() {
11 @Override
12 public String str() {
13 return "SUCCESSFUL!";
14 }
15 };
16 return testIF;
17 }
18
19 public static void PrintIF(TestIF testIF) {
20 System.out.println("Has received: " + testIF.str());
21 }
22}
输出结果
1Has received: SUCCESSFUL!
总结
来自jiany的订正:
抽象是模板,接口是契约。接口规定了这个类可以实现的功能。