Java多线程的实现需要有一个前提:有一个线程的执行主类。
多线程的主类
普通的Java方法要想执行,需要有一个类,类里面有一个main方法,这样的类就是主类。
而线程的方法要想执行,除了如同普通方法那样的主类,还需要一个多线程的主类。
如果要想实现多线程的主类,现在有两种方法:
- 继承一个Thread类;
- 【推荐】实现Runnable、Callable接口。
继承Thread实现多线程主类
java.lang.Thread是一个线程操作的核心类。如果现在要想定义一个线程的主类,就是直接继承Thread类,然后覆写其中的run()
方法。这个方法就相当于普通主类的main方法。
当有了线程的主类之后,我们会考虑怎么调用。但是,注意的是,调用线程的主类是通过主类的main方法来调用的。调用方法是Thread主类的start
方法实现线程启动的。
class MyThread extends Thread{
private String title;
public MyThread(String title) {
this.title = title;
}
@Override
public void run() {
for(int i=0;i<10;i++){
System.out.println("My thread title="+title+"i="+i);
}
}
}
public class ThreadDemo {
public static void main(String args[]){
MyThread myThread1 = new MyThread("thread1");
myThread1.start();
MyThread myThread2 = new MyThread("thread1");
myThread2.start();
MyThread myThread3 = new MyThread("thread1");
myThread3.start();
}
}
线程交替执行的过程如下:
由于是交替执行的,每次执行的效果应该都是不一样的。
为什么要通过start调用run方法呢?
简单来说,我们编写了run方法,可实际上要实现多线程,必然是对操作系统的调用,由操作系统协调系统资源来实现。
start函数中通过一个start0来调用不同操作系统上的JVM,由JVM负责向不同的操作系统进行协调。这样,就屏蔽了底层的资源协调和实现细节,编码人员只需要关注程序协调的统一接口start
方法即可。