Java多线程的引入与使用方法
多线程的引入
随着个人计算机以及服务器等平台的硬件性能的增强,传统单线程任务很难做到对硬件资源的高效利用,故如今越来越多的软件在程序编写中引入多线程技术。使得在一个线程正在进行等待或费时的操作时,能有其他的线程继续执行程序中的其他功能,提高软件的响应能力或整体效率。
预备知识
概念
在学习多线程的实现方法之前,首先要了解几个概念。
- 进程 ,进程是一个个独立的程序,每个进程独占自己的内存空间。
- 线程 ,线程是进程的执行路径,一个进程至少有一个线程。
进一步来说,线程有以下特点:
—— 一个进程的几个线程之间共享一部分内存资源。
—— 每个线程都有自己独立的栈空间。
—— 每个线程之间共享堆内存。
—— 每个线程执行时调用的方法都会进入自己的栈空间。
—— 线程之间可以自由切换,并发执行。
—— 线程是在进程基础之上的进一步划分。
—— 一个进程启动之后,里面的若干执行路径又划分成若干个线程。
—— 如果一个进程没有线程了 则马上要被关闭。
- 并行 指两个或多个事件在同一时刻发生(同时发生)。
- 并发 指两个或多个事件在同一个时间段内发生。
- 同步 多个线程排队执行 , 效率低但是安全。
- 异步 多个线程同时执行 , 效率高但是数据不安全。
调度
1.分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
2.抢占式调度
优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性)。
Java中多线程默认使用的为抢占式调度。
3.注意事项
- 对于CPU的一个核心而言,某个时刻,只能执行一个线程。
- 而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。
- 多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的 使用率更高。
- 抢占式分时调度 在切换执行的线程时,切换会消耗一定时间 在时间上相对直接排队一个一个的完成任务会更慢。
- 排队式 第一人 1* T 第N人 N* T )(并发式 第一人&第N人 均为N* T。
相关类或接口
1.Runnable接口
Runnable作为一个接口,其中只包含了一个抽象的run ( )方法,编写实现Runnable接口的类,需要重写抽象的run ( )方法。
实现了Runnable接口的类,在创建实例对象后,该对象就可以看做一个任务。
static class MyTask implements Runnable{
@Override
public void run() {
//任务内容
}
}
2.Thread类
Thread类作为Java中的线程类,其实例对象即为一条线程。
几种常见的构造方法
- 无参构造方法
Thread t = new Thread();
- 指定线程名称
Thread t = new Thread("小猪佩奇一号");
- 指定任务对象
public static void main(String[] args) {
//传入一个匿名对象
Thread t = new Thread(new MyTask());
}
static class MyTask implements Runnable{
@Override
public void run() {
//任务内容
}
}
- 指定任务对象和线程名称
public static void main(String[] args) {
//传入一个匿名对象
Thread t = new Thread(new MyTask