java多线程的4种实现方式
条评论1. 继承 Thread 类,重写 run 方法(其实 Thread 类本身也实现了 Runnable 接口)
2. 实现 Runnable 接口,重写 run 方法
3. 实现 Callable 接口,重写 call 方法(有返回值)
4. 使用线程池(有返回值)
1. 继承 Thread 类,重写 run 方法
每次创建一个新的线程,都要新建一个 Thread 子类的对象
启动线程,new Thread 子类().start()
创建线程实际调用的是父类 Thread 空参的构造器
1 | public class MyThread { |
2. 实现 Runnable 接口,重写 run 方法
不论创建多少个线程,只需要创建一个 Runnable 接口实现类的对象
启动线程,new Thread(Runnable 接口实现类的对象).start ()
创建线程调用的是 Thread 类 Runable 类型参数的构造器
1 |
|
3. 实现 Callable 接口,重写 call 方法(有返回值)
自定义类实现 Callable 接口时,必须指定泛型,该泛型即返回值的类型
每次创建一个新的线程,都要创建一个新的 Callable 接口的实现类、
如何启动线程?
(1)创建一个 Callable 接口的实现类的对象
(2)创建一个 FutureTask 对象,传入 Callable 类型的参数
public FutureTask(Callable
(3)调用 Thread 类重载的参数为 Runnable 的构造器创建 Thread 对象
将 FutureTask 作为参数传递
public class FutureTask
public interface RunnableFuture
如何获取返回值?
调用 FutureTask 类的 get () 方法
1 |
|
4. 线程池
Executors 类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/** *
* 线程池
* 跟数据库连接池类似
* 避免了线程的创建和销毁造成的额外开销
*
* java.util.concurrent
*
* Executor 负责现成的使用和调度的根接口
* |--ExecutorService 线程池的主要接口
* |--ThreadPoolExecutor 线程池的实现类
* |--ScheduledExecutorService 接口,负责线程的调度
* |--ScheduledThreadPoolExecutor (extends ThreadPoolExecutor implements ScheduledExecutorService)
*
*
* Executors工具类
* 提供了创建线程池的方法
* */
public class ThreadPool { public static void main(String[] args){ //使用Executors工具类中的方法创建线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
ThreadPoolDemo demo = new ThreadPoolDemo(); //为线程池中的线程分配任务,使用submit方法,传入的参数可以是Runnable的实现类,也可以是Callable的实现类
for(int i=1;i<=5;i++){
pool.submit(demo);
} //关闭线程池 //shutdown : 以一种平和的方式关闭线程池,在关闭线程池之前,会等待线程池中的所有的任务都结束,不在接受新任务 //shutdownNow : 立即关闭线程池
pool.shutdown();
}
} class ThreadPoolDemo implements Runnable{ /**多线程的共享数据*/
private int i = 0;
@Override public void run() { while(i<=50){
System.out.println(Thread.currentThread().getName()+"---"+ i++);
}
}
}
1 |
|
发现更多更好玩的,欢迎关注我的微信公众号: FullStacker
![](/img/fullstacker.jpg)