并发学习第一篇——Runnable

@FunctionalInterface   ----------声明是函数式接口,"有且仅有一个"抽象方法,即下面的run()
public interface Runnable {
    /**
     * 实现Runnable接口必须覆盖run()方法 
     * 在Thread中调用start()时会自动调用这个run()*/
    public abstract void run();
}

源码对Runnbale类的注释翻译大体如下:

如果一个类的实例需要用Thread去执行,那么这个类应该实现Runnable;

如果不使用Thread的其他方法,则应尽量选择实现Runnable接口,覆盖run()方法;

可以通过实例化Thread,并将自身(实现了Runnable)作为参数传递给Thread,而不需要继承Thread

记笔记:

1、Runnable没有创建线程实例的能力,仍然是放在Thread中运行

2、实现Runnable接口后,直接调用run()是不会创建线程的,相当于只是调用了一个普通的run()方法

3、尽量用实现Runnable接口的方式,放到Thread里启动线程,这样可以起多个线程运行这个run()方法逻辑(共享资源)

一般用法示例:

lambda表达式:

new Thread( () -> System.out.println("hello world") ).start();

一般写法:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("hello world");
    }
}).start();

一般步骤:

//1、实现Runnable接口,覆盖run()
class MyRunnable implements Runnable{
    public void run(){                                                                                
        ..........
    }
}
//2、创建一个Thread实例,并以你的Runnable对象作为入参
Thread thread = new Thread(new MyRunnable());
//3、调用Thread实例的start()启动线程
thead.start();

上面讲了,实现Runnable,可以让多个线程一起执行run()逻辑

因此,可以这样子跑三个线程:

new Thread(new MyRunnable()).start();
new Thread(new MyRunnable()).start();
new Thread(new MyRunnable()).start();

或者

for(int i=0;i<3;i++){
   new Thread(new MyRunnable()).start();
}

或者使用线程池:

ExecutorService service = Executors.newFixedThreadPool(10);
for(int i=0;i<3;i++){
   service.submit(new MyRunnable());
}

和Thread的关系和对比留在下一个章节

 

posted @ 2021-02-23 20:01  鼠标的博客  阅读(251)  评论(0编辑  收藏  举报