多线程的详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/meiwei_1/article/details/53308017
多线程

一、进程
定义:正在执行的程序,进程就是系统会分配内存空间和资源。
问题:eclipse和vnc是同时运行的吗?
其实不是,看似同时运行,其实不是。在同一个时间点上,只能由一个程序在cpu上运行。虽然目前电脑是多核,但是cpu的
个数再多,也多不过进程数。【其实正在执行的程序都是在抢占cpu,多进程是提高了cpu的使用率】
二、线程
定义:程序的【一条执行路径】
单线程:程序只有一条执行路径
多线程:程序有多条执行路径
问题:多线程有什么作用,可能提高速度吗?
多线程不能提高执行速度,当一个程序有多条执行路径(多线程),那么这个程序就有更多机会去抢到cpu。
作用:让程序抢到cpu的几率更高
并行和并发
并行:程序在同一个【时间点】上执行
并发:程序在同时【时间段】执行(Java程序是并发)
三、java中实现多线程
java中实现多线程的方式有两种:
(1)继承Thread类
a:自定义一个类去继承Thread类
b:重写run方法
c:创建自定义线程类对象
d:启动线程[start方法]
启动多个线程,执行结果不一定相同,【原因:线程具有随机性】
【run方法和start方法区别?】
run方法是线程一启动,jvm会自动运行的,人为直接调用run方法相当于调用普通方法。
start方法是启动线程的方法,调用后,jvm会自动调用run方法。

(2)实现Runnable接口
a:自定义一个类去实现Runnable
b:实现run方法
c:创建自定义类的对象A
d:创建Thread对象,并把A作为构造参数传递
e:启动线程
(3)两种方式对比
A:继承方面来看
使用继承Thread的方式,因为java是单继承,有局限性
因为java中类可以实现多个接口,所以第二种方式更好点。
B:资源共享来看
使用第二种实现Runnable的方式,可以实现属性值共享
注意点:java是多线程的,一般来说,有两个线程:主线程和gc线程
GC在java中是 垃圾回收 机制,当你创建一个对象时,它就开始跟踪,当对象“可到达”时,就自动回收,也可以手动调用,但一般不推荐使用
四、线程中的方法
(1)线程休眠 sleep
Thread.sleep(毫秒数)
注意点:sleep方法在哪个线程中被调用了,就让哪个线程休眠
(2)线程的中断 interrupt
打断线程:
a:做标记,判断标识
b:使用线程对象.interrupt();打断线程,相当于抛出了InterruptedException
c:对于流阻塞,不能使用interrupt去打断,只能引发一个异常
(3)线程的礼让 yield
注意点:线程调用yield方法会中断执行一下,之后还会参与抢占cpu
(4)线程的优先级 getPriority() 和 setPriority(值)
注意点:值的范围一定要在1-10之间,默认是5
(5)线程的加入 join
等待线程执行完毕
(6)守护线程
设置了守护线程的标志位 setDaemon(true)
注意点:当线程A设置为守护线程,其他线程都执行完毕而线程A还未执行完毕,则线程A终止执行
gc线程是守护线程
(7)其他的方法
activeCount():返回当前线程线程组中活动线程数
setName(),getName():设置/获取线程的名称
currentThread():返回当前线程
getState():线程的状态
isAlive():判断线程状态
五、线程的生命周期
创建,等待,运行,结束,堵塞
参考《线程的生命周期图.png》

猜你喜欢

转载自blog.csdn.net/meiwei_1/article/details/53308017