Java对多线程的支持:
通常情况下,对多线程的支持都是由操作系统提供相应的接口来实现的(即由操作系统来提供对线程的调用和管理),而Java是第一个在语言级上支持多线程的语言,这就是说在Java虚拟机内部自己要实现一个线程调度管理器,这个调度器可以实现对Java程序中的线程进行管理,这样无论虚拟机所在的操作系统是否支持,Java语言都是支持多线程的。
但是,这个java虚拟机自己实现的线程调度器的功能并不是很强大,他只支持抢占式的进程调度,即优先级高的进程总是获得执行的机会,并且高优先级的进程可以随时剥夺正在运行的低优先级进程运行的权力,而对于通常的时间片轮换这个线程调度器本身是不支持的。
注意:我们不可以完全依靠在Java中高优先级线程永远执行的特点来实现某些功能,因为有的时候一个长时间得不到运行的线程也有可以被线程调度器,调起运行!
在Java中实现多线程的三种方式:
(一)继承Thread类:
1.定义一个类作为一个新的类A,要求其继承自Thread类;
2.在类A中覆盖Thread类的Run方法;
3.在要启动线程的地方,new一个类A的对象a表示一个新的线程,调用对象a的start方法来启动这个线程。
(二)实现Runnable接口:
1.定义一个类A要求其实现Runnable接口;
2.在类A中覆盖Runnable接口中的Run方法;
3.在要启动线程的地方,new一个Thread类的对象B表示一个新的线程,并将一个类A的对象a作为参数传给B的构造函数,这样这个B(新的线程)的Run方法的行为就由类A的Run方法控制,最后调用B的start方法启动这个线程。
(三)使用内部类:
1.定义一个新的类Outer;
2.在这个类Outer的内部定义一个内部类Inner(可以是私有的),Inner要继承自Thread类或实现Runnable 接口;
3.Outer要提供一个方法,如getThread()来返回一个Inner的对象;
4.在要启动线程的地方,同上两种方法。
三种方式的比较:
方式一:最直观好理解的方式,但不常用!
方式二:只要新的线程类不需要就给Thread类的其他方法,最好用这种方式,他可以方便的实现多个线程对同一资源的共享,因为这时这几个线程都是同一个类的对象。
方式三:在这个新的线程类同时还要继承其他类(Java不支持多继承)和实现其他接口时可以使用,并且也能完成访问同一资源!
通常情况下,对多线程的支持都是由操作系统提供相应的接口来实现的(即由操作系统来提供对线程的调用和管理),而Java是第一个在语言级上支持多线程的语言,这就是说在Java虚拟机内部自己要实现一个线程调度管理器,这个调度器可以实现对Java程序中的线程进行管理,这样无论虚拟机所在的操作系统是否支持,Java语言都是支持多线程的。
但是,这个java虚拟机自己实现的线程调度器的功能并不是很强大,他只支持抢占式的进程调度,即优先级高的进程总是获得执行的机会,并且高优先级的进程可以随时剥夺正在运行的低优先级进程运行的权力,而对于通常的时间片轮换这个线程调度器本身是不支持的。
注意:我们不可以完全依靠在Java中高优先级线程永远执行的特点来实现某些功能,因为有的时候一个长时间得不到运行的线程也有可以被线程调度器,调起运行!
在Java中实现多线程的三种方式:
(一)继承Thread类:
1.定义一个类作为一个新的类A,要求其继承自Thread类;
2.在类A中覆盖Thread类的Run方法;
3.在要启动线程的地方,new一个类A的对象a表示一个新的线程,调用对象a的start方法来启动这个线程。
(二)实现Runnable接口:
1.定义一个类A要求其实现Runnable接口;
2.在类A中覆盖Runnable接口中的Run方法;
3.在要启动线程的地方,new一个Thread类的对象B表示一个新的线程,并将一个类A的对象a作为参数传给B的构造函数,这样这个B(新的线程)的Run方法的行为就由类A的Run方法控制,最后调用B的start方法启动这个线程。
(三)使用内部类:
1.定义一个新的类Outer;
2.在这个类Outer的内部定义一个内部类Inner(可以是私有的),Inner要继承自Thread类或实现Runnable 接口;
3.Outer要提供一个方法,如getThread()来返回一个Inner的对象;
4.在要启动线程的地方,同上两种方法。
三种方式的比较:
方式一:最直观好理解的方式,但不常用!
方式二:只要新的线程类不需要就给Thread类的其他方法,最好用这种方式,他可以方便的实现多个线程对同一资源的共享,因为这时这几个线程都是同一个类的对象。
方式三:在这个新的线程类同时还要继承其他类(Java不支持多继承)和实现其他接口时可以使用,并且也能完成访问同一资源!