java 多线程

来源:互联网 发布:网络用语sd是什么意思 编辑:程序博客网 时间:2024/06/09 14:56

线程与进程

1)线程比进行划分得更小

2)每个进程都有一段专用的内存区域和一组系统资源,而线程却共享内存单元(包括代码和数据),通过共享的内存单元来实现数据交换、实时通信和必要的同步操作

 

接口与抽象类的不同

1)接口里的数据成员必须初始化,且数据成员均为常量(即不能更改)

2)接口里的方法必须全部生命为abstract,即接口不能像抽象类一样保有一般的方法,必须全部是“抽象方法”

一个接口的声明

interface 接口名称
{

       final 数据类型 成员名称 = 常量;

       abstract 返回值的数据类型 方法名称(参数…);

}

接口是java中实现多继承的一种机制;接口也可以继承(且一个接口可以继承多个接口)

 

利用继承Thread类实现多线程

1)创建一个类TestThread,继承Thread类,并实现run()方法

2)在程序中实例化TestThread类对象,调用start()方法即可

利用实现Runnable接口实现多线程

1)创建一个类TestThread,并覆写Runnable接口中的run()方法,则该类为一个多线程实现类实例化

2)在程序中实例化TestThread类对象t

3)通过TestThread类(Runnable接口的子类)实例化一个Thread对象,再调用start()方法即可启动多线程

Runnable接口中并没有start()方法,所以一个类实现了Runnable接口也必须用Thread类中的start()方法来启动多线程

PS:使用该方法的情况,一个类继承了某一个类,同时又想采用多线程技术(java不允许多继承,只允许单一继承)

 

继承Thread类以及实现Runnable接口的区别

1)Thread方式各个线程间资源不共享,Runnable方式各线程间资源共享

2)Runnable方式适用于已经继承了某一个类的子类,而又想放入多线程中的情况(java中不允许多重继承

 

 

一个线程一般具有六种状态

1)NEW:尚未启动的线程

2)RUNNABLE:正在Java虚拟机中之行的线程

3)BLOCKED:受阻塞等待某个监视器锁的线程

4)WAITING:无限期的等待另一个线程来执行某一特定操作的线程

5)TIMED_WAITING:等待另一个线程来执行某一操作或者等待指定时间的线程

6)TERMINATED:已退出的线程

 

前台线程与后台线程

       对于一个java程序,只要还有一个前台线程在运行,该进程就不会结束

       一般的线程都是前台线程,在某个线程对象启动之前调用了setDaemon(true)方法,这个线程就变成了后台线程

 

线程的强制执行

       线程可以调用join()方法来强制执行,其它线程必须等到该线程执行结束才能执行

       另外还有有参数的join()方法

1)Join()     等待该线程终止

2)Join(long millis)           等待该线程终止,最长时间为millis毫秒

3)Join(long millis, int nanos)        等待该线程终止,最长时间为millis毫秒+nanos纳秒

 

线程的中断

       在一个线程执行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它

 

代码的原子性

       即一段代码一旦开始执行,则必须等到该段代码运行结束,其它线程才能调用该段代码;即该段代码是一个整体,不能执行到一半的时候进行线程的切换

同步代码块与同步方法即保证了代码的原子性,只需要利用synchronized关键字

 

线程的同步机制

       wait()/notify()/notifyAll(),只能在synchronized方法中调用,即先取得对象的锁标记;notify()只能唤醒同一对象监视器中调用wait()的线程,且notify()唤醒在此对象监视器上的单一线程,notifyAll()可以唤醒在此对象监视器上的所有线程

 

 

伪代码如下:

synchronized(obj){

       while(!condition){

              obj.wait();

       }

       //dosomething

}

 

Synchronized(obj){

       condition =ture;

       obj.notify();

}

原创粉丝点击