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()这种方式来获取。