package java.lang;
/**
* Runnable接口应该由,实例要由线程执行的类,来实现。
* 类必须定义一个名为run的无参数方法。
*
* <p>
* 该接口旨在为那些希望在活动时执行代码的对象提供一个通用协议。
* 例如,Runnable是由Thread类实现的。
* 处于活动状态仅仅意味着一个线程已经启动,但还没有停止。
*
* <p>
* 此外,Runnable提供了在不子类化Thread的情况下使类处于活动状态的方法。
* 实现Runnable的类可以在不子类化thread的情况下运行,方法是实例化一个线程实例并将自己作为目标传递。
* 在大多数情况下,如果你只是计划覆盖run()方法而不是其他线程方法,那么应该使用Runnable接口。
* 这一点很重要,因为类不应该子类化,除非程序员打算修改或增强类的基本行为。
*
* 我们知道创建线程有两种方式:
*
* override掉Thread的run方法:
* new Thread() {
* @Override
* public void run() {
* int count = 0;
* for(int i = 1;i <= 100;i++)
* count += i;
* }
* }.start();
*
* 看过Thread源码都知道,我们调用Thread#start()后,会创建一个新线程来执行这个Thread的run方法。
* 但上面这种执行者和执行task绑定在一起了,不灵活。
*
* 传递一个Runnable对象给Thread:
* new Thread(new Runnable(){
* @Override
* public void run() {
* int count = 0;
* for(int i = 1;i <= 100;i++)
* count += i;
* }
* }).start();
*
* 这样,通过创建一个Runnable匿名内部类对象,可以达到同样的效果,但是却把执行者和执行task分开了。
*
* public class Thread implements Runnable {
* /* What will be run.
* private Runnable target:
*
* @Override
* public void run() {
* if (target != null) {
* target.run();
* }
* }
* }
*
*从Thread源码可以看到,当没有override掉run方法时,run方法将执行持有的Runnable对象的run方法。简单的说,就是套娃。
*
*
*
* public class test5 {
* public static Runnable task = new Runnable() {
* @Override
* public void run() {
* int count = 0;
* for(int i = 1;i <= 100;i++)
* count += i;
* }
* };
*
* public static void main(String[] args) throws InterruptedException {
* new Thread(task).start();
* new Thread(task).start();
* }
* }
*
* 将执行者和执行task分开是有好处,上例就体现了两个执行者可以执行同一个task。
*
* @author Arthur van Hoff
* @see java.lang.Thread
* @see java.util.concurrent.Callable
* @since JDK1.0
*/
@FunctionalInterface
public interface Runnable {
/**
* 当一个实现接口Runnable的对象被用来创建一个线程时,
* 启动这个线程会导致对象的run方法在单独执行的线程中被调用。
*
* <p>
* 运行方法的一般约定是,它可以采取任何行动。
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}