线程笔记

Java采用的是抢占式调度方式。


Thread 和 Runnable区别。
1.通常情况使用Thread即可,但是Thread是一个类,如果想线程化的对象已经继承了一个类,则由于单继承的特性。只能通过实现Runnable接口来实现。
2.Runnable适合多个相同程序的代码去处理同一个资源,该资源放在实现Runnable接口的类中,传递到不同的线程中即可。
比如下面的例子,两个线程处理的是同一个数据。
class DataThread implements Runnable{
String ManyThreadSharedData;
}

Thread td1 = new Thread(DataThread);
Thread td2 = new Thread(DataThread);

线程同步方法1:
对象可以是任意的,但是需要是多个线程中相同的对象,不能是各自的。
synchronized(对象) {
需要被同步的代码;
}

线程同步方法2:将同步关键字放到函数前面,方法的同步锁的是this对象。
静态方法的锁,锁的是当前类的class对象,即ABC.class
private synchronized int func(){

}


线程声明周期:

新建线程->start()->就绪状态->获取CPU权限->执行->run结束则死亡

如果在执行中被调用了sleep和wait则进入阻塞状态,阻塞状态下调用notify或者sleep时间到则进入就绪状态。

jion方法是自己先执行,其他线程等待。yield方法是放弃优先执行权,如果CPU确实空闲自己也会被执行。


为什么wait和notify不定义在Thread中?

因为wait,notify的方法必须通过锁对象(任意的对象)调用,而锁对象是属于任意的对象(即Object的子类)


线程安全类-查看源码可以看到这些类的函数都是带着synchronized:

StringBuffer,Vector,Hashtable


当然想用同步的也不一定非用Vector不可,

如果想把非同步的ArrayList,HashMap,Set等变为同步的,则只需要通过Collections.sychronizedMap,List,Set等方法即可实现。


long 不能用作switch
而 int、 short、 char 或者 byte都可以自动转化为int所以可以。
long的范围大于int所以不可以。
java7新特性,String可以用于Switch




Lock加锁
private Lock lock = new ReentrantLock();


....


try{
lock.lock();
}finally{
lock.unlock();//防止中间被打断而没有解锁。
}


以上。

你可能感兴趣的:(线程笔记)