Java中的多线程浅析(1)
1. 让多个程序片段呈现出同时执行的效果,就是多线程。多线程不一定是真实的同时执行。
2. Java中如果要代码片段能在多线程中执行,有几种种办法:
<1> 实现Runnable接口。Runnable接口中只有一个方法run()。
<2> 重写Thead的run()方法。
<?>使用Callable接口。以后再说吧
3. 怎样开启一个线程,针对上面的两种实现方式,分别举例:
<1>
class theadTest implements Runnable
{ …
@override@
Public void run()
{
//新线程中执行代码
}
}
使用新线程执行上面的代码:
Public Static void Main()
{
Thead_newThead =new Thead(new theadTest();
newThead.start();
}
<2>
class theadTest extends Thead
{ …
@override@
Public void run()
{
//新线程中执行代码
}
}
使用新线程执行上面的代码:
Public Static void Main()
{
theadTest _newThead=new theadTest();
newThead.start();
}
4. 新启动的线程在run()方法执行结束后自动消亡。
5. 新启动的线程不一定会顺利执行,它有可能处于执行、阻塞、就绪等状态。
6. 正在执行的线程是执行状态。
7. 因为缺少执行资源的支持,比如,无法获得I/O设备,其他线程正在执行本线程需要的互斥代码等而导致本线程无法执行,则本线程处于阻塞状态。
8. 什么都准备好了,立马能执行。但是由于线程调度原因,系统未执行当前线程(未获得CPU资源),则线程处于就绪状态。
9. 线程状态可相互转变。
10. 多线程中的代码片段不再保证原子执行。比如:
线程1中执行
this.a=变量(假设此时变量值为2);
Intb=a;
如果有线程2也运行这段代码:
this.a=变量(假设此时变量值为3);
Intb=a;
则无法保证线程1中的b值为2还是为3。原因是,无法保证this.a=变量(=时变量值为2);执行完以后执行了Int b=a;还是执行了this.a=变量(变量值为3);
11. 如果要对上面程序结果可控,必须对多线程代码段进行同步。Java中同步可用两种方法:对象锁和synchronized来控制。
12. 对象锁方法: 每个对象都一个锁,每个锁只能由一个线程获得。当一个线程顺利获得了一个锁,则该线程的代码就可顺利执行下去,而且在锁的保护下,执行过过程绝无其他线程打扰。如果获得不到锁,则代码阻塞在此,直至获得锁再执行。在Java中,ReentrantLock对象的锁可直接控制程序。假设obj为ReentrantLock对象,其控制程序的方法为:
Obj.lock() //代码执行到这里,程序试图获得obj的对象锁,如果获取不到,则阻塞在这里等着。如果获取到,则继续执行
受保护的代码段;//在这里执行的代码,保证无其他线程同时执行。
Obj.unlock //释放掉对obj锁的控制,让其他线程执行。
13. 可使用synchronized关键字对其他对象的锁进行控制,其方法为:
Synchronized(其他的对象obj)//在这里,程序试图获得obj对象的锁。这里,obj可以是任何对象,不局限于ReentrantLock对象
{
//受保护的代码
}//执行出代码段,则自动释放了该对象的锁
14. 可用Synchronized修饰类的函数成员,这时,Synchronized控制的是this所代表的对象的锁。