印象笔记地址:https://app
(1)创建一个类继承Thread类,重写run()方法,将所要完成的任务代码写进run()方法中;
(2)创建Thread类的子类的对象;
(3)调用该对象的start()方法,该start()方法表示先开启线程,然后调用run()方法;
![](https://i-blog.csdnimg.cn/blog_migrate/30291a12ecfa4dcd333762ba374168d5.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a2c9d88e7a6d79158f4d22ae6e2d26de.png)
注意:不是创建了线程.start()就直接运行,而是 要等待时间片轮转
2.创建线程的第二种方式:实现Runable接口
(1)创建一个类并实现Runnable接口
(2)重写run()方法,将所要完成的任务代码写进run()方法中
(3)创建实现Runnable接口的类的对象,将该对象当做Thread类的构造方法中的参数传进去
(4)使用Thread类的构造方法创建一个对象,并调用start()方法即可运行该线程
3.创建线程的第三种方式:实现Callable接口
(1)创建一个类并实现Callable接口
(2)重写call()方法,将所要完成的任务的代码写进call()方法中,需要注意的是call()方法有返回值,并且可以抛出异常
(3)如果想要获取运行该线程后的返回值,需要创建Future接口的实现类的对象,即FutureTask类的对象,调用该对象的get()方法可获取call()方法的返回值
(4)使用Thread类的有参构造器创建对象,将FutureTask类的对象当做参数传进去,然后调用start()方法开启并运行该线程。
ExecutorService es = Executors.newFixedThreadPool(3);
Callable<Integer> task1 = new MyTask1();
Callable<Integer> task2 = new MyTask2();
Future<Integer> f1 = es.submit(task1);
Future<Integer> f2 = es.submit(task2);
Integer result1 = f1.get();
Integer result2 = f2.get();
System.out.println(result1 +result2);
}
class MyTask1 implements Callable<Integer> {
@Override
public Integer call() throws Exception {
Integer sum = 0;
for (int i = 1; i <= 50; i++) {
sum += i;
}
return sum:
}
4.创建线程的第4种方式:通过线程池
(1)使用Executors类中的newFixedThreadPool(int num)方法创建一个线程数量为num的线程池
(2)调用线程池中的execute()方法执行由实现Runnable接口创建的线程;调用submit()方法执行由实现Callable接口创建的线程
(3)调用线程池中的shutdown()方法关闭线程池
-
Excutor(java.util.concurrent包下):线程池的顶级接口
-
ExcutorService: 线程池接口,继承了Excutor接口 可通过submi t (Runnable task) 提交任务代码。
-
Excutors:线程池工具类,工厂类,可用于生成线程池对象
![](https://i-blog.csdnimg.cn/blog_migrate/f205d49b899b0a76adf102f935353aff.png)
![](https://i-blog.csdnimg.cn/blog_migrate/61567e4638acc4f00fef36ff09f4994f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b9e06bdacab73f7c4655027ff683f825.png)