---------------------- android培训、java培训、期待与您交流! ----------------------
1、线程间通信
其实就是多个线程在操作同一个资源,但是操作的动作不同。
等待唤醒机制
wait()
notify()
notifyAll()
都使用在同步中,因为要对持有监视器(锁)的线程操作。
所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义在Object类中呢?
因为这些方法在操作同步中线程时,都必须要标识它们所操作线程持有的那个锁。
只有同一个锁上的被等待线程,可以被同一个锁上的notify唤醒。
不可以对不同锁中的线程进行唤醒。
也就是说,等待和唤醒必须是同一个锁。
而锁可以是任意对象,所以,可以被任意对象调用的方法定义在Object类中。
思考1:wait(),notify(),notifyAll(),用来操作线程为什么定义在了Object类中?
1、这些方法存在于同步中。(因为要对持有锁的线程操作,而只有同步才具有锁)
2、使用这些方法时必须要标识所属的同步的锁。(等待和唤醒必须是同一个锁)
3、锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。
思考2:wait(),sleep() 有什么区别?
wait():释放cpu 执行权,释放锁。
sleep():释放cpu 执行权,不释放锁。
生产者消费者
对于多个生产者和消费者
1、为什么要定义while循环判断标记?
让被唤醒的线程再一次判断标记。
2、为什么定义notifyAll?
因为需要唤醒对方线程。只用notify容易出现只唤醒本方线程的情况,导致程序中的所有线程都等待。
JDK1.5升级:
import java.util.concurrent.locks.*;
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
lock.lock();//上锁
condition.await();//等待
condition.signal();//唤醒(condition.signalAll();)
lock.unlock();//解锁
·一个lock上可以有多个condition对象。
在JDK1.5中提供了多线程升级解决方案。
将同步synchronized替换成显示Lock操作。
将Object中的wait(),notify(),notifyAll(),替换成Condition对象。,
该对象可以Lock锁,进行获取。
在该实例中,实现了本方只唤醒对方操作。[day12-06]
停止线程(原理只有一种,run方法结束)
stop方法已经过时。
1、定义循环结束标记
因为线程运行代码一般都是循环,只要控制了循环即可。
2、使用interrupt(中断)方法
该方法是结束线程的冻结状态,使线程回到运行状态中来。
如何停止线程。
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束。也就是线程结束。
特殊情况:
当线程处于冻结状态。就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行的状态时,这是就需要对冻结状态进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记,让线程结束。
Thread类中提供了该方法。Interrupt
线程类的其他方法
setDaemon(boolean b);//标记为守护线程(后台线程),当所有前台线程结束后自动结束。
1、当正在运行的线程都是守护线程时,Java虚拟机退出。
2、必须在线程启动前调用。t1.setDaemon(true);
join();//抢夺cpu执行权。join可用来临时加入线程执行。
当A线程执行到了B线程的join()方法时。A就会等待。等B线程都执行完,A才会执行。join可以用来临时加入线程执行。
自定义线程名称
toString();//线程名称,优先级和线程组。
设置优先级:
setPriority(int num);//所有线程(包括main)都默认为5
凡是数据是固定的,定为常量。数据共享的定为静态static。
yield();//临时停止当前正在运行的线程。
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima