多线程是重点,听身边有过面试经历的同学说起过,就算我们不是为了面试,我们也得学好它吗,记得有句古话:书到用时方恨少。这句话送给每一位努力学习的人,加油。
在Java的JDK开发包中,实现Java多线程有两种方式:
(1)使用继承Thread类;
(2)实现Runnable接口。
注意:public class Thread implements Runnable 说明Thread类已经实现了Runnable接口,他们之间具有多态的关系。
为什么提供了这两种实现多线程的方法,一个不够用吗?
大家知道,面向对象中,具有三大特性:封装、继承、多态。并且在Java中,继承是单根继承机制,也就是说,一个子类只能有一个直接的父类。如果我们在实现一个类的时候,使它继承了一个类,那么我们就无法再根据它继承Thread类了,所以第一种方式创建多线程最大的局限就是不支持多继承。所以,第二种方式,就完全可以解决第一种问题带来的弊端。
下面是一个简单的创建多线程的例子:
public class Mythread extends Thread{
@Override
public void run(){
super.run();
System.out.println("MyThread!");
}
}
//运行类
public class Run{
public static void main(String[] args){
Mythread mythread = new Mythread();
mythread.start();//具有两个作用:1.启动一个线程 2.调用run方法
//从调用start之后,才开始创建一个新的线程,main线程顺序执行,
//新创建的线程执行run方法中的代码。
System.out.println("运行结束!");
}
}
代码的运行结果和代码的执行顺序或调用顺序是无关嘚。如果多次调用start方法,则会出现
IllegalThreadStateException异常。
这里需要说明一下调用
start方法的原理:当调用此方法时,会通知线程规划器,此线程已经准备就绪,等待调用线程对象的
run方法,这个过程其实就是让系统安培一个时间来调用Thread对象的run方法,使线程得到运行,启动线程达到异步执行的效果。
实现Runnable接口来创建多线程
步骤:实现Runnable接口,目的是实现Runnable接口中的run方法
创建一个Thread对象,并将实现的Runnable接口的对象,传递给Thread构造器。
调用Thread对象的
start方法。
代码演示如下:
public class MyRunnable implements Runnable{
@Override
public void run(){
System.out.println("当前线程的名字为:"+Thread.currentThread().getName());
System.out.println("运行中!");
}
}
//运行类代码
public class Run{
public static void main(String[] args){
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.setName("Runnable-Thread");
thread.start();
System.out.println("main线程运行结束");
}
}
前面我们说过,Thread类本身也实现了Runnable接口,也就意味着:构造函数Thread(Runnable target)不光可以传入Runnable接口的对象,还可以传入一个Thread类的对象,这样完全可以将一个Thread对象中的run方法交给其它线程进行调用。