Java 多线程,Thread,Runnable,Callable
1. 什么是线程?
一个程序同时执行多个任务,每一个任务称为一个线程。
2. 怎么创建线程?
2.1 创建线程的方式
1) 实现Runnable接口,并实现run()方法.
2) 继承Thread类,并且重写run()方法.
3) 实现Callable接口,并实现call()方法.
2.2 创建线程
1)通过实现Runnable接口的方式:
由于Runnable接口是一个函数式接口,所以在此可以用lambda表达式的方式来实现这个接口.
Runnable runnable = () -> { for (int i = 0;i < 20;i++){ System.out.println("Thread_1," + i); } };
2)通过继承Thread类的方式:
class Thread_2 extends Thread{ @Override public void run() { for (int i = 0;i < 20;i++){ System.out.println("Thread_2," + i); } } }
3)通过实现Callable接口的方式:
class Thread_3 implements Callable<StringBuilder>{ @Override public StringBuilder call() throws Exception { StringBuilder sb = new StringBuilder("Thread_3,"); for (int i = 0;i < 20;i++){ sb.append(Integer.toString(i)); System.out.println("Thread_3," + i); } return sb; } }
此方式也可以用lambda表达式的方式直接实例化一个线程。
这种方式是支持返回值的,Callable<T> 中的泛型就是这个线程的返回值,不写默认返回null。
2.3 启动线程
前两种创建线程的启动方式是t.start();
第三种的启动方式是t.call(),同时带有返回值。
Thread t1 = new Thread(runnable); Thread_2 t2 = new Thread_2(); Thread_3 t3 = new Thread_3(); t1.start(); t2.start(); try { String thread3Result = t3.call().toString(); System.out.println("Thread_3 :" + thread3Result); } catch (Exception e) { e.printStackTrace(); }