Java总共有两种方式实现多线程
方式1:通过继承Thread类的方式
packagecom.day04;/*** 通过继承Thread类并复写run方法来是实现多线程
*
*@authorAdministrator
**/
public class ThreadDemo1 extendsThread {
@Overridepublic voidrun() {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 voidmain(String[] args) {//创建线程对象
ThreadDemo1 t1 = newThreadDemo1();
ThreadDemo1 t2= newThreadDemo1();//调用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接口来实现
packagecom.day04;/*** 通过实现Runnable接口来实现多线程
*
*@authorAdministrator
**/
public class ThreadDemo2 implementsRunnable {
@Overridepublic voidrun() {for (int i = 0; i < 4; i++) {//获取当前线程的名字
String threadName =Thread.currentThread().getName();
System.out.println(threadName+ " print " +i);
}
}public static voidmain(String[] args) {//创建线程对象
ThreadDemo2 t1 = newThreadDemo2();//调用start方法启动多线程
newThread(t1).start();newThread(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()这种方式来获取。