标签:object runnable 线程休眠 log 实现 效率 web服务器 方法体 体会
9、线程强制执行join ()
10、观察线程状态getState()
11、线程优先级setPriority(1), getPriority()
12、守护线程setDaemon(true)
15、实现线程同步来实现线程安全
16、JUC (并发领域的一些编程)
线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中;
一个进程可以并发多个线程,每条线程并行执行不同的任务;
多线程程序设计的好处是提高了程序的执行吞吐率和执行效率。
后台任务,:定时向大量用户推送信息例如广告部件,不胜其扰,大家定有体会
异步处理,例如:批量/O操作,发微博、记录日志等
分布式计算,共享稀有资源和平衡负载
web服务器本身,例如: Tomcat
继承Thread类不建议使用,避兔oop局限性
实现Runnable接口推荐使用,避兔单继承局限性,方便同一个对象被多个线程使用
顺序执行:你吃饭吃到一半,电话来了,你-直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
并发:你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
----------》交替做不同事情的能力
并行:你吃饭吃到一半,电话来了,你-边打电话- -边吃饭,这说明你支持并行。此处注意理解:是同时吃,同时说,要真严格的说的话,需要2张嘴才是并行。
----------》同时做不同事情的能力
礼让不一定成功,看CPU心情
想像为vip插队的测试
getState()
先设置优先级再启动
线程分为用户线程和守护线程,其它都为用户线程
虚拟机必须确保用户线程执行完毕,虚拟机不必确保守护线程执行完毕
如果JVM中没有一个正在运行的非守护线程,这个时候,JVM会退出。换句话说,守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点。
通常来说,守护线程经常被用来执行一些后台任务,但是呢,你又希望在程序退出时,或者说JVM退出时,线程能够自动关闭,此时,守护线程是你的首选。
队列+锁----------》有锁线程安全
synchronized每个对象对应一把锁,默认锁的是this,锁的对象就是变化的量(增删改的量)
------------》方法中加关键字synchronized
-----------》放进代码块中synchronized(变化的量){}
线程安全类型的一些类----------------------》例如:CopyOnWriteArrayList线程安全的集合
多个线程互相抱着对方的资源,然后形成僵持
1.互斥条件: 一个资源每次只能被一个进程使用。
2.请求与保持条件:一个 进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成-种头尾相接的循环等待资源关系。
上面列出了死锁的四个必要条件,我们只要想办法破其中的任意一个或多 个条件就可以避免死锁发生
从jdk5.0开始,ReentrantLock类实现了Lock
使用Lock锁,JVM将花费较少的时间来调度线程,性能更好。并且具有更好的扩展性(提供更多的子类)
◆优先使用顺序:
◆Lock >同步代码块(已经进入了方法体,分配了相应资源) >同步方法(在方法体之外)
synchronized与Lock的对比
1、Lock是显式锁(手动开启和关闭锁,别忘记关闭锁) synchronized是隐式锁, 出了 作用域自动释放
2、Lock只有代码块锁,synchronized有代码块锁和方法锁
生成者消费者模式
测试:
1.生产者消费者模型-->利用缓冲区解决:管程法(利用容器)
生产者
消费者
缓冲区
产品
测试类
结果
信号灯法(利用标志位)
生产者
消费者
产品
测试
结果
利用线程池创建线程
wait => Object
sleep => Thread
wait会释放锁。
sleep睡觉了,抱着锁睡觉,不会释放!
wait必须在同步代码块中
sleep可以再任何地方睡
wait不需要捕获异常
sleep必须要捕获异常
转载于狂神老师 ,本文仅作为笔记使用
标签:object runnable 线程休眠 log 实现 效率 web服务器 方法体 体会
原文地址:https://www.cnblogs.com/zhuchengbo/p/12641098.html