------- android培训、java培训、期待与您交流! ----------
概念:
线程是最小的控制和执行单元,线程存在与进程里,每个进程拥有至少一个或多个线程。
创建线程有2种方法:
一种方式是继承Thread类,覆盖run方法
Class ThreadCase extends Thread{
public void run(){
//dosomething
}
}
产生并执行一个线程则是调用Thread的start()方法
new ThreadCase().start()
!直接调用run()方法可以执行run()方法内部的代码,但是无法产生一个新线程,和普通方法没有区别。
创建线程的另一种方式是继承Runnable接口,实现run方法
Class RunableCase implements Runnable{
public void run(){
//dosomething
}
}
将Runnable实现对象传进Thread类的构造方法
new Thread(new RunnableCase()).start();
与直接继承Thread类不同,Runnable接口避免了单继承的局限性(!java中只允许继承一个类,但是可以实现多个接口)
多线程的特性,随机性,CPU决定执行哪个线程,顺序不确定
冻结进程有两种方式
sleep(time)----》知道时间
wait()-----》notify()直到用notify唤醒,否则线程一直等待(阻塞);
挂掉进程
stop()
多线程总会产生线程安全问题
可以使用同步代码快来解决
synchronized(Object)
{}
同步的前提:
1.必须要有两个以上的线程
2.必须是多个线程使用同一个锁
弊端:多个线程需要判断锁,较为消耗资源
同步方法没有传入对象锁,同步方法用到的锁是方法所在的类的实例---->this
静态同步方法使用的锁是所在类的字节码对象
ClassName.class
饿汉式线程安全,懒汉式可以实现延迟加载,但是会产生线程安全问题,需要使用同步
同步会出现死锁的情况,
死锁一般出现在同步中
同步嵌套死锁
线程间通信:
其实就是操作同一资源,但操作动作不同
等待唤醒机制
wait()
notify()
这些方法都需要监视器所以只能存在与同步中
Objectkey.wait()
Objectkey.notify()
Objectkey.notifyAll()
JDK5中
显式的Lock替代了schronized解决方案
condition替代了Object中的wait notify和notifyAll
在新特性中,一个lock可以被N个condition绑定
这样不同的condition可以改变不同的线程状态
lock lock=new ReentrantLock();
Condition cond = lock.newCondition();
//需要同步的方法中
lock.lock()//加锁
lock.unlock()//解锁
//改变线程状态使用condition
cond.await();
cond.signal()
线程的停止方法,stop已经过时
Thread提供的更新的interrupt方法将冻结中的线程强制恢复到执行状态
守护进程即后台进程
使用setDeamon()来设置为守护进程
当后台所有进程为守护进程,则程序会终止
join抢夺CPU执行权
t1.start()
t2.staty()
t1.join()
此时主线程会释放执行权,t1,t2争夺,等到t1执行完,主线程才会恢复并和t2争夺执行权
设置休闲级setPriority
Priority默认为5,最小为1,最大为10
MAX_PRIORITY=10
MIN_PRIORITY=1
NORM_PRIORITY=5