一、多线程基本概念
1.并发和并行
并行:在多个cpu中同时进行,任务不中断
并发:多个任务在一个cpu中切换执行,任务会中断(挂起、继续和终止)
2.进程和线程
进程:正在运行的软件
- 独立性:进程是独立运行的基本单位,同时也是系统分配资源和调度的独立单位
- 动态性:实质是程序的一次执行过程,进程是动态产生、动态消亡的。
- 并发性:任何进程和其它进程一起并发执行
线程:进程中的单个顺序控制流,是一条执行路径。 - 单线程:一个进程中如果只有一条执行路径,则称为单线程程序。
- 多线程:一个进程如果有多条执行路径,则称为多线程程序。
二、多线程的实现方式
1.集成Thread类的实现方式
- 定义类集成Thread类
2.实现Runnable接口
- 新建类MyRunnable实现Runnable接口
- 重写run()
- 创建 MyRunnable对象mr
- 创建Thread对象,把MyRunnable对象作为参数传递进去t1 = new Thread(mr)//创建线程对象
- t1.start();
3.Callable和Future
- 定义类MyCallable实现Callable接口
- 重写Object call(),返回值代表线程运行完毕之后的结果.
- 创建MyCallable对象mc
- 创建Future实现类对象 FutureTaskString> ft= new FutureTask<>(mc);
可以获取线程执行完毕之后的结果,并将ft作为参数传递给Thread对象
- 创建Thread对象,t1 = new Thread(ft)//创建线程对象
- t1.start();
- 再调用get()方法,可以获得线程运算的结果
4.优劣比较
4.1实现接口的方式:
- 扩展性强,实现接口的同时还可以继承其他类;
- 编程复杂,不能直接使用Thread类中的方法。
4.2 继承Thread类的方式:
- 编程简单,直接使用Thread类中方法;
- 扩展性差,不能继承其它类。
三、常用方法
1名称设置
1.1 获取线程名称
getName();
获取当前线程的名称。
- 线程是有默认名的
Thread-编号,Thread-0
1.2设置名称
- t1.setName(“线程1”);
- 构造方法设置名称:自己创建的类重写父类带名称的构造方法。在构造方法里直接传入名称。
2.获取线程对象
2.1 当前线程
public static Thread Thread.currentThread();
获取执行到这里的线程
2.2 线程休眠
public static void sleep(long time)
线程休眠,单位为毫秒
Thread.sleep(1000);//线程休眠1秒