首页 > 技术文章 > Java多线程的两种实现方式

nanyangke-cjz 2017-06-20 17:21 原文

Java总共有两种方式实现多线程

方式1:通过继承Thread类的方式

 

package com.day04;

/**
 * 通过继承Thread类并复写run方法来是实现多线程
 * 
 * @author Administrator
 *
 */
public class ThreadDemo1 extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            // 获取当前线程的名字
            // String threadName = Thread.currentThread().getName(); //方式1
            String threadName = super.currentThread().getName(); // 方式2
            System.out.println(threadName + " print " + i);
        }
    }

    public static void main(String[] args) {
        // 创建线程对象
        ThreadDemo1 t1 = new ThreadDemo1();
        ThreadDemo1 t2 = new ThreadDemo1();
        // 调用start方法启动多线程
        t1.start();
        t2.start();
    }

}

运行结果如下:

Thread-1 print 0
Thread-0 print 0
Thread-1 print 1
Thread-0 print 1
Thread-0 print 2
Thread-0 print 3
Thread-1 print 2
Thread-1 print 3

可以发现总共开启了两个线程,并且两个线程是随机打印出对应的序号,这是因为这两个线程在抢占系统资源是随机的,谁抢到,谁就执行打印语句。

方式1:通过实现Runnable接口来实现

 

package com.day04;

/**
 * 通过实现Runnable接口来实现多线程
 * 
 * @author Administrator
 *
 */
public class ThreadDemo2 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 4; i++) {
            // 获取当前线程的名字
            String threadName = Thread.currentThread().getName();
            System.out.println(threadName + " print " + i);
        }
    }

    public static void main(String[] args) {
        // 创建线程对象
        ThreadDemo2 t1 = new ThreadDemo2();
        // 调用start方法启动多线程
        new Thread(t1).start();
        new Thread(t1).start();
    }

}

运行结果如下:

Thread-0 print 0
Thread-0 print 1
Thread-1 print 0
Thread-0 print 2
Thread-1 print 1
Thread-1 print 2
Thread-1 print 3
Thread-0 print 3

可以发现总共开启了两个线程,并且两个线程是随机打印出对应的序号,这是因为这两个线程在抢占系统资源是随机的,谁抢到,谁就执行打印语句。

总结:

1.继承Thread类并复写run方法的方式:

优点:实现简单。

缺点:因为java是单继承,所以当某个类继承了Thread类,就不能在继承其他的类了。

2.通过实现Runnable接口的方式

缺点:实现稍微复杂点。

优点:因为是通过实现接口的方式,所以它可以再继承其他的类,不存在局限性。

注意的是:继承Thread如果要获取当前线程的名字可以通过Thread.currentThread().getName()之外,还可以通过super.currentThread().getName()这种方式来获取,而实现接口的方式只能通过Thread.currentThread().getName()这种方式来获取。

 

推荐阅读