在写一个很小很小的网页面监控程序的时候需要使用到java的多线程,在网上简单看了一下,使用了一下,简单总结一下以备以后使用。
java程序的多线程组织有两种方式:实现Runnable接口和继承Thread。
1. 实现Runnable接口:
// 实现Runnable接口class MyThreadRunner implements Runnable { public void run() { System.out.println("Thread running!"); } }启动方式:
// 实现Runnable接口方式的线程启动MyThreadRunner runner = new MyThreadRunner();Thread thread = new Thread(runner);thread.start();
2. 继承Thread类方式:
// 继承Threadclass MyThread extends Thread { public void run() { System.out.println("Thread running!"); }}启动方式:
// 实现Thread接口方式的线程启动MyThread myThread = new MyThread();myThread.start();3. 两者的区别与相同点:
其实从本质上来说,两者都是一样的。不管使用哪种方式,可以看到都需要创建一个Thread对象(或子类对象),而在经过查看Thread源码,可以看到其实Thread其实已经实现了Runnable接口,所以我们可以大胆的想象一下,线程是这样子的:在启动一个新的线程后,线程都会自动的去执行Thread对象中Runnable接口的run方法;继承Thread类的方式,其实是重写Thread类实现的run方法而已;而实现Runnable接口的方式,则是直接替换Thread对象(子对象)中的target属性(Runnable类型的);
相对来说,实现Runnable的话更方便实现多线程间的资源共享,因为创建线程的target属性指向的是同一个Runnable实现类对象。
Thread类反编源码片段:
public class Thread implements Runnable { ...... /* What will be run. */ private Runnable target; ...... public void run() { if (target != null) { target.run(); } } ...... }线程Demo完整代码:
package tutorial.example;public class ThreadDemo { public static void main(String[] args) { // 实现Runnable接口方式的线程启动 MyThreadRunner runner = new MyThreadRunner(); Thread thread = new Thread(runner); thread.start(); // 实现Thread接口方式的线程启动 MyThread myThread = new MyThread(); myThread.start(); }}// 实现Runnable接口class MyThreadRunner implements Runnable { public void run() { System.out.println("Thread running!"); } }// 继承Threadclass MyThread extends Thread { public void run() { System.out.println("Thread running!"); }}