java多线程 Runnable源码分析

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();
}

 

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页