Java中的多线程浅析(1)

来源:互联网 发布:怪物猎人4g手机数据库 编辑:程序博客网 时间:2024/06/01 22:27

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所代表的对象的锁。

0 0
原创粉丝点击