多线程总结

    多线程

1….进程和线程的区别?(是否占有资源 进程的撤销创建爱你开销大于线程)

进程:是程序执行的一个最小单元,进程是一个动态过程,本身占有系统资源,运行时占有cpu 从创建到运行到死亡即是整个进程的过程
线程:是进程的一个子程序,是一个独立的执行流 ,本身不占有资源,和同属同一个进程下的线程共享资源,但是自身含有独立的栈和程序计数器[堆内存和方法区是线程共享的],进程是重量级的,线程是轻量级的

2….多线程的优点:提高CPU利用效率【而不是提高执行速度】

3…并行:两个任务同时进行 ,需要多核CPU
并发:两个任务安排轮流进行
4….用户线程和守护线程的区别?
用户线程是一般线程,守护线程是后台运行的。比如jvm的垃圾回收、内存管理等线程

5…java程序的运行原理:java命令启动一个程序时候,jvm启动,就启动了一个进程,此时main方法(主线程)开始执行,而垃圾回收机器GC也会启动,称为守护线程

6…线程的常见创建方式:继承Thread 实现Runnable 如果在线程创建好之后,持续去启动start()会发生运行时异常IllegalThreadStateException
异常
7..线程实现的两种方式的比较
继承:单继承、直接是一个类可以直接使用
实现:多实现 不可以直接创建类 需要借Thread

8….在多线程中,异常只可以进行处理不可以抛出

9…join() yield()sleep() wait() 的区别?
join()是表示加入线程,等到加入的线程执行结束之后,该线程才可以执行 有重载方法
millis毫秒
yield()静态方法 是礼让线程,出让cpu让其他线程去执行,该线程停止运行
sleep()静态方法 设置休眠时间,时间到之后会继续执行 调用此方法会发生异常IntercepetedException
wait()Object类中的一个方法, 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
10….线程的几种状态?
新建 就绪 运行 阻塞 死亡 以及他们之间的关系

11….线程同步[代码块同步 方法同步]….
多线程并发时,多个代码同时执行,如果希望某一代码执行的时候CPU不要切换到其他线程工作 同一时间只可以执行一段代码,可以保证线程之间共享数据的安全

12…同步锁 synchronized
同步代码块:锁对象可以是任意对象,但是需要保证在多个同步代码块中使用的锁对象是一个,但是不可以使用this,this代表当前对象
同步方法:对于普通方法锁对象是this
对于静态方法锁对象是本类的class对象
还有volatile Lock
13…..定时任务 Timer 继承TimerTask 重写其中的run()schedule(TimerTask task , Date First long milis
可以使用集合中的工具类Collections中的synchronizedMap/set/list()获取线程安全的hashmap
14…并发编程Executor 引入线程池Executor框架的原因是
因为new Thread创建的线程是可以无限制的创建,称为野线程,之间相互竞争,会发生过多的占用系统资源而导致 系统瘫痪
而线程池可以有效地控制并发编程数,提高系统资源的利用率,避免发生过多资源竞争而发生阻塞
15..创建线程池的方式:
1.public static ExecutorService newFixedThreadPool();
创建固定数目的线程
线程池执行任务:void execute(Runnable command)
在执行任务时,会使用线程池中的不确定的线程去执行任务,线程如果处于空闲状态,就有可能执行当前任务,若没有,则等待其完成,生命周期长
2. public static ExecutorService newCachedThreadPool()
创建带有缓冲的线程池,会创建一定的线程
在使用线程池去执行任务时,如果当前线程池中有可用线程,则直接执行任务
如果当前线程中的所有线程都属于非空闲状态,则会创建新的线程 生命周期短
3. public static ExecutorService newSingletonThread();
创建单线程的线程池
该线程池中只有一个线程存在,当有任务需要执行时,若线程处于空闲状态,则立即执行,否则任务处于阻塞状态
4.public static ScheduleExecutorService newScheduleThreadPool(int corePoolSize)
线程池中的线程创建在执行任务时可以规定时间执行
schedule(Runnable command ,long delay , TimeUnit unit)
command:需要执行的任务 Runnable的实现类
delay:延迟时间的数
unit:延迟的时间的单位
线程池可执行的任务:
Runnable接口:没有返回值
public void run()
Callable 接口 有返回值 通过Future来接收,并且通过其中的get()
v call()
16….线程池的生命周期
运行 (创建后直接进入运行状态) 关闭:shutdown(等待完成后关闭) shutdownNow(立即关闭–终止)
17….线程协作:多个线程同时执行,比如火车站卖票
18….线程死锁问题:两个线程分别持有不同的锁对象,都需要获取各自的锁去执行任务,在此过程中会出现互不相让的情况
线程死锁的四个必要条件:
互斥:一个资源只可保证被一个线程使用
请求保持:一个进程因请求资源而阻塞时,对已获得资源保持不放
不剥夺条件:进程在获得资源在未使用完之前,不可以进行强行剥夺
循环等待条件:若干进程形成一种头尾相接的循环不等待资源关系
避免线程死锁:尽量不要出现锁的嵌套 Lock中的tryLock方法可以等待时间获取锁 在一个程序执行时,每次尽可能只获取一个锁
19…线程通信
线程间的通信:
线程由运行到阻塞到就绪
主要用到的方法是Object类中的
wait():线程处于等待状态,如果没有线程来唤醒,则一直处于等待
状态,直到有线程调用notify/notifyAll来唤醒该线程
wait(long millis):也会使线程处于等待状态,线程重新回到就绪状态的条件:等待的
时间到、有线程调用notify/notifyAll()来唤醒线程
notify():唤醒当前处于等待状态的所有线程中的随机一个
notifyAll():唤醒………..所有线程
在线程通信中,首先要保证线程执行的任务时同步的,可以是同步代码块,也可以是同步方法
在线程通信中由谁来执行wait和notify?
—在其中只能由锁对象来执行wait和notify。
互斥锁:再一次执行中,只能有一个线程持有锁对象—jdk1.5的新特性
线程同步:使用ReentrantLock类的lock()和unlock()进行同步
线程通信:使用ReentrantLock类的newCondition()可以获取Condition对象
需要等待的时候使用Condition()的await(),唤醒的时候用signal()
不同的线程使用不同的Condition,这洋就可以区分唤醒的时候找哪个线程了
Lock—已知实现–ReentrantLock
lock()获取锁
unlock()释放锁
Lock–ReentrantLock–newCondition()获取Condition
await()//使线程处于等待状态
signal()唤醒一个处于等待状态的线程
signalAll()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值