并发学习第一篇——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的关系和对比留在下一个章节