Java多线程小总结
多线程
线程与进程
线程:具有完成特定任务的一条执行路径,是cpu执行的最小单位
进程:正在执行的程序
重点:cpu在某个时间刻度上只能够执行一条原子性语句 字节最小是bit位
原子性语句:不能够再次分割的语句。
cpu执行原理
-
除了多核处理器,本质上cpu在某一个时间点上执行了一条线程
-
cpu看起来像是同时运行,实际上一次只能执行一个线程的一条原子性语句,之所以看起来同时运行,就是因为处理速度非常快。
-
在java的线程程序中,采用的是抢占式调度模型
-
并发与并行的区别
-
并发:同一个时间段同时执行
并行:在同一时刻上同时执行,物理上的同时执行。
5.同步与异步的区别
同步:本质就是串行执行,并发情况下会出现同步问题。
异步:能够在处理一个任务的同时还能够处理其他事情。
6.一个进程包含多个线程,一个java进程至少包括了主线程、垃圾回收线程
thread类
自定义类继承thread类,重写thread类里面的run()方法。创建线程对象,启动线程。
启动线程的是start()方法,不是run()方法。一下简单说说开启线程的方式。
-
实现runnable接口方式开启线程
-
避免java单继承带来的局限性
适合多个相同程序的代码区处理同一个资源的情况,比如:多个线程实现分割复制视频。
自定义类实现runnable接口重写run()方法,并把自定义类作为构造参数传给thread,进而调用thread.start()方法启动线程
好处:有效的数据分离,可以使用多个线程处理一个数据。
2.实现callable方式开启线程
需要依赖futuretask类
futuretask类对接接口runnablefuture,runnablefuture接口继承了runnable、future接口。所以callable本质上还是使用了runnable接口的实例来开启线程。不同的是callable类可以产生值返回,但是使用get()获取值会堵塞线程。
3.匿名内部类开启线程
没啥好说的就是匿名创建了thread对象,并开启线程。也可以匿名创建runnable子类并给thread调用开启线程,不过两种方式一起使用,优先使用thread的子类。
设置获取线程的名称
1.通过构造方法
thread(string name) 创建一个名叫name的线程
thread(runnable target,string name)
2.通过线程的成员方法
setname(string name)
getname()
3.通过静态方法
threa.currentthread().getname();获取主线程的名称
getid();获取线程的id,long类型
线程的优先级
java使用的是抢占式调度模型,优先级高的线程会优先使用cpu,同级别的优先级,则是随机选择,优先级高的获取cpu的时间相对要多一些。
设置获取优先级:
public final int getpriority() 获取线程的优先级
public final void setpriority(int newpriority) 设置线程的优先级
线程的优先级:1~10,10个级别,数值越高优先级越高。系统的优先级,基本上我们无法控制,我们所设置的优先级,只是局部的程序。
线程休眠
thread.sleep(1000); 阻塞正在执行的线程1秒
线程中断
public final void stop():停止线程,直接终止线程,不会再执行。
public void interrupt(); 给子线程抛出一个异常,子线程还可以继续执行。
后台线程
一般来说jvm中会包括两种线程:用户线程、后台线程
后台线程:在程序运行的时候在后台提供的一种通用的服务线程,并且这种线程,并不是程序的必要部分。
当用户线程结束时,会终结所有的后台线程。
比如:程序中主线程结束了,其他子线程也会被强制结束。
线程加入
public final void join(); t1.join:优先让t1线程执行结束。
线程礼让
public static void yield() 使线程让出cpu的执行权,然后和其他线程一起再来抢这个执行权。
上一篇: 【Javaweb】poi实现通过上传excel表格批量导入数据到数据库
下一篇: 早晚会变胖的