java多线程实现方法和比较

来源:互联网 发布:中国资讯型数据库作用 编辑:程序博客网 时间:2024/06/07 00:03

在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口。

对于直接继承Thread的类来说,代码大致框架是:

/** * @author Rollen-Holt 继承Thread类 * */class hello extends Thread {     public hello() {     }     public hello(String name) {        this.name = name;    }     public void run() {        for (int i = 0; i < 5; i++) {            System.out.println(name + "运行     " + i);        }    }     public static void main(String[] args) {        hello h1=new hello("A");        hello h2=new hello("B");        h1.start();        h2.start();    }    private String name;}
实现Runnable接口:

/** * @author Rollen-Holt 实现Runnable接口 * */class hello implements Runnable {     public hello() {     }     public hello(String name) {        this.name = name;    }     public void run() {        for (int i = 0; i < 5; i++) {            System.out.println(name + "运行     " + i);        }    }     public static void main(String[] args) {        hello h1=new hello("线程A");        Thread demo= new Thread(h1);        hello h2=new hello("线程B");        Thread demo1=new Thread(h2);        demo.start();        demo1.start();    }     private String name;}

那么:为什么我们不能直接调用run()方法呢?

我的理解是:线程的运行需要本地操作系统的支持。

如果你查看start的源代码的时候,会发现:

public synchronized void start() {        /**     * This method is not invoked for the main method thread or "system"     * group threads created/set up by the VM. Any new functionality added     * to this method in the future may have to also be added to the VM.     *     * A zero status value corresponds to state "NEW".         */        if (threadStatus != 0 || this != me)            throw new IllegalThreadStateException();        group.add(this);        start0();        if (stopBeforeStart) {        stop0(throwableFromStop);    }}private native void start0();

实现Runnable接口比继承Thread类所具有的优势:

1):适合多个相同的程序代码的线程去处理同一个资源

2):可以避免java中的单继承的限制

3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。

0 0