4.多线程
1.为什么要有多线程
因为操作系统支持多任务同时进行,所以程序也得支持并发编程
多线程可以提高工作效率
1.线程比进程更加轻量级
创建线程比创建进快,销毁线程比销毁进程快,调度线程要比调度进程快
2.一个进程至少要有一个线程,所以创建一个进程就相当于创建了一个线程
5.多线程操作
线程是操作系统的概念,操作系用内核提供了对线程的操作,并且提供了相应的api,Jav对这个api进行了封装就是Thread类。
6.线程的创建以及以运行
1.通过继承Thread来实现
线程是通过抢占的方式进行执行的所以执行顺序不一定就是创建的顺序。
线程sleep为什么进行异常处理? 因为当sleep进行时,就会发生线程的中断,此时一些资源可能就被其他线程使用,所以要产生中断异常。
2.通过实现Runnable接口来实现
3.通过匿名内部类来实现
4.通过匿名内部类的方法创建Runnable方法
5.通过lamda表达式进行书写
书写的时候最好带上括号,这样子方便观看
6.Thread的构造方法
7.线程的观察方法
通过jdk目录下的jconsole创建连接观察本地的线程
8.线程的几个常用属性
属性:ID getid() 名称 getName() 状态getState()
优先级 getPriority() 是否是后台线程 isDaemon()
是否存活 isAlive() 是否被中断 isinterupted()
后台线程:
后台线程也叫守护线程,当前台线程结束了,整个线程也就结束了(相当远演员表演节目结束了,整个节目也就结束了,后台线程相当于是后台的工作人员)。前台线程不结束,整个线程就不会结束。如果主线程结束了,整个线程也就相当于结束了,后台线程也就随之结束了。
thread t1线程默认的是前台线程。当前台线程没有结束的时候,整个主线程是没有结束的。等前台线程结束了整个线程才会结束。
下面把t1设置成后台线程,当主线程(也就是main线程结束了),整个线程也就结束了。
9.run和start的区别(面试常考)
run()方法是main线程所执行的线程,所以打印的时候都是在一个线程当中执行的所以打印顺序是从上往下一个个打印的。
start()方法是thread线程所执行的,所以与main线程是并发执行的,打印顺序是随机的。
总结:以上验证方法是通过sleep()方法来进行验证的,当每次打印执行后sleep了,才能让当前线程进入到休眠状态,从而才会有新的线程被cup执行,才能观察到有所交替的现象。如果没有使用sleep的情况下,当前线程执行完才会有下一个线程进行执行,就看不出来并发执行的现象。所以使用sleep来观察线程的并发现象。
10.中断线程
方法:1.通过标志位中断线程 2.通过thread.interrupt来中断线程
1.通过修改线程标志位停止线程
2.通过thread.interrupt()方法来中断线程
相关方法1.interrupt() //中断线程 如果过线程正在运行当中
-
boolean interruoted() 3.boolean isinterrupted()//获取线程的标志位
1.interrupt()
直接调用interrupt方法来实现线程的中断,然后catch会进行中断异常的处理。
2.boolean interruoted() isinterruptted()
前者是判断当前的中断标志位,判断之后进行标志位的清楚;后者也是判断当前中断标志位,判断之后不进行清楚。
11.等待一个线程
public void join()等待线程
main主线程需要等待t1和t2全部执行完才会执行main线程。
但是t1和t2的执行是并发执行的,最终main等待的时间是t1和t2的执行时间的最大者即max(t1,t2)。
join(long millis)就是相当于main线程只等待相应的秒数就会执行main线程 。
12.获取当前线程的引用
public static Thread currentThread();//在哪个线程就会返回当前线程的引用
13.休眠当前的线程
sleep()方法来实现
实际休眠的时间是大于等于设定的休眠时间的。
14.多线程的优势
多线程与单线程相比,具有的优势是:当数据量达到一定的程度时,多线程的并发进行比单线程要快很多。但是数据量并不大的时候,没有必要去使用多线程,这样反而使速度降下来,会比较慢。
定义一个start和一个end变量来分别存放开始的时间和结束的时间。通过System.currentTimeMillis()来记录当前的运行时间,然后进行相减就能得到从线程开始到线程结束的运行时间。
需要注意的是:定义end的时候所获取结束时间,需要考虑另外两个子线程都结束了才算整个线程任务的就结束,所以在这里要用到join()方法来进行线程的等待,最后算出最终的结果。
15.线程的状态(面试按照六种状态来答)
进程的状态:就绪,运行,阻塞等状态
通过Thread.State+点来对线程的状态的具体属性进行相关的操作
一共有6种状态。
NEW :安排了工作但是还没有开始行动,计划去做什么
RUNNABLE:可工作的
BLOCKED:表示排队等着其他的事情,因为竞争资源而引起的阻塞
WAITING:表示排队等着其他的事情,join(),需要等待其他线程的唤醒
TIMED_WAITING:表示排队等着其他的事情,有一定的时间,就等待一定的时间
TERMINATED:工作完成了
通过Thread.State()来获得当前线程的状态。
通过jconsole.exe文件来进行线程的观察线程的状态。