标签:java线程 自己 限制 基础上 png 模拟 比较 堆内存 lis
进程接口Runnable是一个函数式接口,它的子类有Thread和任何实现它的类。但是由于它是一个函数式接口想要启动必须借助Thread的start方法,因此这里就用到了装饰器模式。把用户实现的Runnable类放入Thread方内部就能在不改变原对象代码的基础上给他扩展出start方法。
线程:一个进程可能需要执行多个任务,多个任务的执行需要同时运行,相互不影响,每个任务由一个线程执行,一个进程可能包含一个或多个线程。
进程之间是相互独立,多个线程可以共享所在进程的堆内存,每个线程有独立的栈和寄存器
多进程就是多个进程同时执行,现代操作系统是多进程的,一个CPU一个时间点只能运行一个进程,CPU需要在多个进程间来回切换,因为CPU速度快,所以用户感觉多个进程同时执行。
多线程是一个进程的多个任务,CPU执行进程时,会在多个任务之间来回切换,会给每个任务一定执行时间(CPU时间片),线程就是CPU分配时间片的单位。
并发
一个CPU在多个线程间切换,不是真正同时执行多个任务
企业级应用:大量用户进行同时访问,服务器会为每个用户开辟新线程,每个用户操作时就不会相互影响。
游戏开发:网络通信、图形绘制、运动控制都需要线程单独执行
继承Thread类,重写run方法
执行线程,调用start方法
1)定义类继承Thread
2)重写run方法
3)创建线程对象,调用start
面试题:执行start和run有什么区别?
只有执行start,操作系统才创建新的线程,执行任务,run还是在主线程执行任务,没有新线程,注意:不要手动调用run方法!!
实现Runnable接口,重写run方法
1)定义类实现Runnable接口
2)实现run方法
3)创建Thread对象,传入Runnable对象
4)调用start方法
面试题:继承Thread和实现Runnable哪个好?
1) 继承Thread类就不能继承其他类,实现Runnable没有此限制
2)实现Runnable强制要求重写run,继承Thread不要求容易出错
多线程的执行是抢占式的,每个线程可能在执行中间,就被其他线程抢占CPU执行,线程会来回抢占CPU。
可以控制CPU给线程分配时间片的概率
线程的方法:
setPriority(int priority)
优先级从低到高1~10,默认是5
开发过程中给任务重要的线程分配更高优先级,让该线程优先完成
类似人的生老病死,线程也有自己的生命周期
单线程中IO会产生阻塞,读写不能同时执行,读写操作必须分别放到不同线程中才能同时执行。
线程的睡眠
可以让当前线程进入睡眠状态
Thread.sleep(毫秒数)
后台线程
也叫守护线程(精灵线程)
一种特殊的线程,为其他线程提供服务,一旦其他线程都死亡了,守护线程会自动死亡。一个典型的守护线程就是GC(垃圾收集器)
方法:
setDaemon(boolean b) true 守护线程,false 非守护线程 (默认)
必须在start之前调用
线程的合并
一个线程可以在执行时合并另一个线程,让另一个线程完成执行完,自己再执行。
run(){
另一个线程.join()
}
注意:两个线程之间不能相互合并,否则可能出现死锁情况
标签:java线程 自己 限制 基础上 png 模拟 比较 堆内存 lis
原文地址:https://www.cnblogs.com/macht/p/11640858.html