20170621线程基本

Q:
作业DAO添加学生,首次处理,代码放在catch块中
快速用数组处理学生List, 添加到Set.
根据学号查询,直接声明一个只有学号的构造方法,这样就可以只通过学号来新建对象来在集合中查询了,删除可用,查询还是要遍历
线程暂停的两种方式sleep,yield有什么不同

何为用户线程,守护线程,如何标记?虚拟机对于守护线程做何种操作?
线程执行时, JVM不关闭,是用户线程
如果只有守护线程,JVM会强行关闭线程,并且关闭JVM
实际开发中,只使用用户线程

线程同步:Synchronized如何使用,何时使用:
多个线程,同一时间,同时修改数据的时候
数据查询不需要上锁。
Synchronize会影响速度,不能滥用

同一时间只能有一个线程访问

方法一:

synchronize(this){

    代码...


}
方法二:如果锁定全部方法,并且有this,则简化写道方法里
public synchronized int quKuan(){
}

当一个线程进入同步块,另一个线程无法访问,只有第一个线程完成访问时候,下一个线程才能够访问。
占用同步块的线程方即使sleep,也不会开锁

如何使得集合同步
1 使用老的集合类: Vector, HashTable等等
2 使用Colletions工具类里面的synchronized类如,synchronizedSet类

Summary:
线程的优先级设置,了解就可以,不要随意改动!

sleep,yield都是静态方法,对当前线程有用,与对象无关.
public static void main(){
....
t1.sleep(10000);
....
}

与t1无关,主线程睡,在main主线程中调用t1.join(),主线程会被阻塞,只有t1完成后,主线程才会回到Runnable队列

车票,取款线程的实例
线程操作的常规情况:使用不同方法,对同一个数据进行不同操作

多线程的情况:
1 同样的方法,修改同样的数据
2 不同的方法修改同样的数据, 生产者消费者方式处理

线程的5种状态描述(如下图), 图片版权归动力节点所有

20170621线程基本_第1张图片
111.PNG

wait()执行时,必须放锁
yield,sleep,进入同步块时候不放锁,不在同步块中,直接放弃cpu,回到同步队列,yield 的作用就是使线程回到可运行队列,提供效率

生产者和消费者模式的套路:
1 锁和铃铛必须是同一个对象
2 线程只有获得锁之后才能执行obj.wait(), obj.notifyAll();
3 在线程中设置一个状态变量,dataIsReady,在不同的状态下让不同的线程来执行
4 生产者和消费者运行的次数要一致

你可能感兴趣的:(20170621线程基本)