JAVA的多线程

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口,下面通过具体代码来看它们的区别

(1)继承Thread实现多线程

package cn.com.thread.demo;

class MyThread1 extends Thread {
    private String name;
    public MyThread1(String name) {
        super();
        this.name = name;
    }
    public void run() {
        for(int i = 0; i < 100; i ++) {
            System.out.println("线程开始:"+ this.name +",i="+i);
        }
    }
}

public class ThreadDemo01 {

    public static void main(String[] args) {
    
        MyThread1 mt1 = new MyThread1("线程a");
        MyThread1 mt2 = new MyThread1("线程b");
        
        /*直接调用类的方法,结果是跟调用普通类的方法一样,执行完一个,再执行另一个,达不到多线程工作的效果*/
        //mt1.run();
        //mt2.run();
        
        /*用start()方法启动线程*/
        mt1.start();
        mt2.start();
        
    }
}

(2)实现Runnable接口产生多线程

package cn.com.thread.demo;

class MyThread2 implements Runnable {
    private String name;
    public MyThread2(String name) {
        this.name = name;
    }
    public void run() {
        for(int i = 0; i < 100; i ++) {
            System.out.println("线程开始:"+ this.name +",i="+i);
        }
    }
}


public class RunnableThread {

    public static void main(String[] args) {
        
        MyThread2 mt1 = new MyThread2("线程a");
        MyThread2 mt2 = new MyThread2("线程b");
        
        /*但是在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。
         此时观察Thread类,有一个构造方法:public Thread(Runnable targer)
         此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。*/
        new Thread(mt1).start();
        new Thread(mt2).start();
        
        /*或者下面的写法*/
        /*Thread t1 = new Thread(mt1);
        Thread t2 = new Thread(mt2);
        t1.start();
        t2.start();*/
    }
}


(3)Thread 和Runnable 两种实现方式的区别和联系:
在程序开发中只要是多线程肯定永远以实现Runnable接口为主,因为实现Runnable接口相比继承Thread类有如下好处:
    避免点继承的局限,一个类可以继承多个接口。
    适合于资源的共享 
 以卖票程序为例,通过Thread类完成:

package cn.com.thread.demo;

class MyThread3 implements Runnable {
    private int ticket = 50;
    public void run() {
        for (int i = 0; i < 60; i ++) {
            if(this.ticket > 0) {
                System.out.println("卖票:ticket" + this.ticket--);
            }
        }
    }
}

public class ThreadTicket {
    
    public static void main(String[] args) {
        
        MyThread3 mt = new MyThread3();
        
        /*在Runnable生成的线程中可以用一个实例在多个线程中调用*/
        new Thread(mt).start(); 
        new Thread(mt).start();
        new Thread(mt).start();
    }

}
原文地址:https://www.cnblogs.com/Yogurshine/p/2840980.html