Java多线程
线程与进程
进程
是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间
线程
1、是进程中的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行. 一个进程最少有一个线程。
2、线程实际上是在进程基础之上的进一步划分,一个进程启动之后,里面的若干执行路径又可以划分成若干个线程。
线程基本使用
在java中线程来使用有两种方法。
1、继承Thread类,重写run方法。
2、实现Runnable接口,重写run方法。
继承 Thread 与实现 Runnable 的区别:
1、从java设计来看,通过继承Thread或者实现Runnable接口来创建线程本质上没有区别,从jbk帮助文档我们可以看到Thread类本身就实现了Runnable接口。
2、实现Runnable接口方式更加适合多个线程共享一个资源的情况,并避免了单继承的限制。
线程终止
1、当线程完成任务后,会自动退出。
2、还可以通过使用变量来控制run方法退出的方式停止线程,既通知方式。
线程常用方法
1、setName //设置线程名称
2、getName //得到线程名称
3、start //使该线程开始执行
4、run //调用线程对象run方法
5、setPriority //更改线程的优先级
6、getPriority //获取线程的优先级
7、sleep //在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)
8、interrupt //中断线程
注意事项和细节
1、start底层会创建新的线程,调用run,run就是一个简单的方法调用,不会重启新线程。
2、线程优先级的范围。
3、interrupt中断线程,但并没有真正结束线程。一般用于中断正在休眠线程。
4、sleep 线程的静态方法,使当前线程休眠。
线程调度
分时调度
所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。
抢占式调度
1、优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。
2、CPU使用抢占式调度模式在多个线程间进行着高速的切换。对于CPU的一个核新而言,某个时刻,只能执行一个线程,而 CPU的在多个线程间切换速度相对我们的感觉要快,看上去就是 在同一时刻运行。 其实,多线程程序并不能提高程序的运行速度,但能够提高程序运行效率,让CPU的使用率更高。
用户线程和守护线程
1、用户线程:也叫工作线程,当线程的任务执行完或通知方式结束。
2、守护线程:一般是为工作线程服务的,当所有的用户线程结束,守护线程自动结束。
3、常见的守护线程:垃圾回收机制。
线程的生命周期
线程的同步
Synchronized
线程同步机制
1、在多线程编程,一些敏感数据不允许被多个线程同时访问时,此时可以使用同步访问技术,保证数据在任何同一时刻,最多有一个线程访问,以保证数据的完成性。
2、线程同步,即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作,其他线程才能对该内存地址进行操作。
3、上锁:当数据被多个线程同时访问时,需要线程拿到唯一的锁时,才能对数据进行操作。
互斥锁
1、java语言中,引入了对象互斥锁的概念,来保证共享数据操作完成性。
2、每个对象都对应一个可称之为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。
3、关键字Synchronized来与对象的互斥锁联系。当某个对象用Synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
4、同步的局限性:导致程序的执行效率低。
5、同步方法(非静态)的锁可以是this,也可以是其它对象(要求是同一个对象)。
6、同步方法(静态)的锁为当前类本身。
注意事项和细节
1、同步方法如果没有使用static修饰,默认锁对象:this。
2、如果方法使用static修饰,默认锁对象:当前类.class。
线程的死锁
多个线程都占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生。
线程池 Executors
如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程 就会大大降低 系统的效率,因为频繁创建线程和销毁线程需要时间. 线程池就是一个容纳多个线程的容 器,池中的线程可以反复使用,省去了频繁创建线程对象的操作,节省了大量的时间和资源。
线程池的优点
- 降低资源消耗。
- 提高响应速度。
- 提高线程的可管理性。
Java中的四种线程池 . ExecutorService
-
缓存线程池
-
定长线程池
-
单线程线程池
-
周期性任务定长线程池
同步与异步
同步
同步:排队执行 , 效率低但是安全.
异步
异步:同时执行 , 效率高但是数据不安全.
并发与并行
并发
并发:指两个或多个事件在同一个时间段内发生。
并行
并行:指两个或多个事件在同一时刻发生(同时发生)。