黑马程序员---多线程

来源:互联网 发布:淘宝店面设计 知乎 编辑:程序博客网 时间:2024/05/24 07:22

---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
线程状态:
新建:start()
运行:具备执行资格,同时具备执行权;
冻结:sleep(time),wait()—notify()唤醒;线程释放了执行权,同时释放执行资格;
临时阻塞状态:线程具备cpu的执行资格,没有cpu的执行权;
消亡:stop()
线程的创建方式:
两种:
第一种:继承Thread类,复写run方法
步骤:1,定义类继承Thread类;
2,复写run方法,将要让线程运行的代码都存储到run方法中;
3,通过创建Thread类的子类对象,创建线程对象;
4,调用线程的start方法,开启线程,并执行run方法。
第二种:实现Runnable接口
步骤:
1,定义类实现Runnable接口。
2,覆盖接口中的run方法(用于封装线程要运行的代码)。
3,通过Thread类创建线程对象;
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。目的是让线程对象明确要运行的run方法所属的对象。
5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。
实现与继承的区别:
Java中支持的是单继承多实现(接口与接口之间可以多继承),所以实现方式的好处就是避免了单继承的局限性,故在定义线程时,建议使用的是实现的方式。
另外,继承方式中线程代码存放在Thread子类的run方法中。而实现方式的县城代码存在于接口的子类的run方法中
多线程的安全问题:
出现原因:某个线程的某些语句在操作共享数据的时候,还没有执行完,就被其他线程操作了,导致原线程操作了错误数据。
涉及的两个因素:1.多个线程 2.共享数据
解决方式:加锁,即是让共享数据一次只能被一个线程操作,只有一个线程操作完成后,另一个线程才能进行操作。
同步的前提:
1.多个线程。2.多个线程使用同一个锁
同步函数用的是this锁。
静态同步函数的锁是:类名.Class(看下反射就可以理解了)
注意死锁,死锁条件:多个锁,共同操作共享资源,等待对方手中的资源。
出现的地方:同步中的嵌套同步。(锁中有锁,锁不同,锁锁等待)

 
JDK1.5新特性:
使用方法:
1.导入包:importjava.util.concurrent.lock*;
2.新建一个锁
由于Lock是个接口所以建对象的时候使用期子类
Lock lock = new Reentrantlock();
3.由于新特性里面锁的一些功能:wait(),notify()等方法都封装在Condition中故调用Lock中的newCondition()方法建立一个Condition对象:
Condition condition =lock.newCondition();
4.使用锁的时候用lock对象调用其lock()方法。
Lock.lock();
5.锁中用到等待,唤醒等方法时用condition这个对象调用。
condition.await();//需要try()catch()或函数上throws
condition.signal();
condition.signalAll();
6.释放锁

Lock.unlock();
控制线程停止的方法:
由于stop()方法已经过时,但是我们发现线程多伴随这循环,所以我们想要控制线程停止就需要控制循环。
 
中断方法interrupt(),强制唤醒(会自动报异常InterruptedException)让线程回到运行状态。
 
守护线程或用户线程
Void setDemon(true);
Join():抢夺所在线程的执行权 直到调用者结束再继续执行主线程。
yield();暂停当前线程,这样可以实现线程的交替运行。
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------详细请查看:http://edu.csdn.net

 

原创粉丝点击