您的位置:首页 > 职场人生

黑马程序员---多线程

2013-07-07 20:52 316 查看
---------------------- 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

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息