多线程学习-Thread、Runnable、Callable
概念:
什么是进程?什么是线程?
进程:
进程则是执行程序的一次执行过程,它是一个动态的概念,是系统资源分配的单位。通常在一个进程中可以包含若干个线程,一个进程中至少有一个线程,不然没有存在的意义。
线程:
线程就是独立的执行路径。在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程,gc线程。Main()方法 称之为主线程,为系统入口,用于执行整个程序、在一个进程中, 如果开辟了多个线程,线程的运行由调度器安排调度,调度器是与操作系统紧密相关的, 先后顺序是不能干预的。对同一份资源操作时会存在资源抢夺的问题, 需要加入并发控制。线程会带来额外的开销,如cpu 调度时间,并发控制开销,每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。
创建线程的三种方式:
第一种:
Thread: 继承Thread 类。
概述:
子类继承Thread 类具备多线程能力。
启动线程: 子对象.start();
注:不建议使用,避免oop(面向对象)单继承局限性。
方法:
1: 创建类 继承Thread , 并重写run() 方法。
2:创建线程对象, 调用start()方法。注: start() 方法调用 是同事执行的,如果调用run() 他会先调用run() 再去执行别的。

示例: 网络下载 文件。需用到jar 包commons-io

代码:

第二种:
Runnable:实现Runnable接口。
概述:
1、实现接口Runnable具有多线程能力。
2、启动线程: 需要传入目标对象+ Thread对象.start()。 注:推荐使用,避免单继承局限性,灵活方便, 方便同一个对象被多个线程同时使用

示例:

第三种:
Callable: 实现Callable 接口。
此线程,与以上俩线程不相同, 线程创建需要返回值。
Callable : 优点: 1、可以定义返回值。 2、可以抛出异常
缺点: 实现较为复杂。需要开启/关闭 服务。
代码:


浙公网安备 33010602011771号