Java多线程技术相关收纳和总结
多线程的概述
线程是进程中的一条执行路径,存在自己独立的栈空间,占用进程中一块桶内存,因此能够独立的执行特定的任务。当多个线程共用一个任务时,对共有的属性和变量进行相应的操作,会引发相应的线程安全问题。
- 线程的三种创建方式
- 线程的6个状态
- 线程安全问题
线程的三种创建方式
1.继承Thread类,重写其中的run()方法,run()编写的就是线程要执行的任务,其方式跟main()一致,是程序的入口。
程序执行图:
如图所示:主线程和线程的执行方式是并发的,在执行上是相互独立的。继承Thread的方式来创建线程,任务是和线程捆绑的一起的,不利于多线程执行一个同一个任务。
2 通过实现Runnable接口,创建任务,在将任务传递给Thread线程。
在这个方式中,同样要重写run()方法。(推荐)
如图所示,任务与线程分离,既提高程序的健壮性,又能够在多线程执行同一个任务时,只需将任务传递,提供便利。
3.通过实现Callable接口,此方法和Runnable不同,存在返回值,能够抛出异常。
线程的6个状态
- new 线程还没有启动的状态
- runnable 线程在执行的状态
- blocked 线程在被阻塞而被监视的状态
- waiting 线程无限期等待的状态
- timed_waiting 线程设置最大等待时间的等待状态
- terminated 线程退出的状态
线程安全问题
当采用多线程去执行一个任务的时候,由于多个线程并发执行,在同一时间段,多个线程同时执行任务,会产生一些线程安全的问题。
如下:创建一个如下任务,输出1-10的值,
程序测试执行如下:
如上图所示,出现了输出同一个数,输出负数的情况。这是由于计算机中线程的调度是抢占式调度,可能发生同一时间段内,多个线程执行再同一个任务,导致数据出现偏差。防止这种情况发生,可以给任务“上锁”。使得线程在执行到“上锁”的地方排队执行,从而避免发生这种线程不安全的问题。
加锁的方式存在显式锁和隐式锁:隐式锁有 1 同步代码块 和 2 同步方法
显示锁有 Lock 锁。