java中实现多线程的方式有两种:
1、实现继承Thread 类的类(重写run方法)
2、实现Runnable 接口(重写run方法)
上述两种方式的关系;
看过jdk你会发现 Thread类是实现了 runnable的接口了的
可见,实现Runnable接口相对于继承Thread类来说,有如下显著的优势: (1)、 适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线
程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。
(2)、 可以避免由于Java的单继承特性带来的局限。开发中经常碰到这样一种
情况,即:当要将已经继承了某一个类的子类放入多线程中,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,那么就只能采用实现Runnable接口的方式了。
(3)、 增强了程序的健壮性,代码能够被多个线程共享,代码与数据是独立的。
当多个线程的执行代码来自同一个类的实例时,即称它们共享相同的代码。多个线程可以操作相同的数据,与它们的代码无关。当共享访问相同的对象时,即共享相同的数据。当线程被构造时,需要的代码和数据通过一个对象作为构造函数实参传递进去,这个对象就是一个实现了Runnable接口的类的实例。
java的任意一个程序都有一个缺省的主线程,主线程是main()方法。
任何线程都有5个状态。创建、就绪、运行、阻塞、终止。
备注:
1、 线程(thread)是指程序的运行流程。“多线程”的机制可以同时运行多个程序块,
使程序运行的效率更高,也解决了传统程序设计语言所无法解决的问题。 2、 如果在类里要激活线程,必须先做好下面两项准备:
(1)、此类必须是扩展自Thread类,使自己成为它的子类。 (2)、线程的处理必须编写在run()方法内。
3、 run()方法是定义在Thread类里的一个方法,因此把线程的程序代码编写在run()
方法内,所做的就是覆盖的操作。
4、 Runnable接口里声明了抽象的run()方法,因此必须在实现Runnable接口的类里
明确定义run()方法。
5、 每一个线程,在其创建和消亡之前,均会处于下列五种状态之一:创建、就绪、
运行、阻塞、终止。
6、 暂停状态的线程可由下列的情况所产生:
(1)该线程调用对象的wait()时。 (2)该线程本身调用sleep()时。
(3)该线程和另一个线程join()在一起时。 7、 被冻结因素消失的原因有:
(1)如果线程是由调用对象的wait()方法所冻结,则该对象的notify()方法被调用
时可解除冻结。
(2)线程进入休眠(sleep)状态,但指定的休眠时间到了。
8、 当线程的run()方法运行结束,或是由线程调用它的stop()方法时,则线程进入消
亡状态。
9、 Thread类里的sleep()方法可用来控制线程的休眠状态,休眠的时间要视sleep()里
的参数而定。
10、要强制某一线程运行,可用join()方法。
11、join()方法会抛出InterruptedException的异常,所以编写时必须把join()方法编写
在try-catch块内。
12、当多个线程对象操纵同一共享资源时,要使用synchronized关键字来进行资源的
同步处理