实现多线程的两种方式
继承Thread类创建多线程
重写Thread类中的run()方法,在run()方法中实现运行在线程上的代码。
下面我们通过一个实例演示,代码如下:
定义一个MyThread类继承Thread类
public class MyThread extends Thread{
@Override
public void run() {
//重写run方法,即线程的执行代码
for (int i = 0; i < 10; i++) {
System.out.println("锄禾日当午"+i);
}
}
}
程序入口代码如下:
public static void main(String[] args) {
//创建自定义Thread对象
MyThread m = new MyThread();
//启动新线程
m.start();
for (int i = 0; i < 10; i++) {
System.out.println("xxxx"+i);
}
}
运行结果如下:
xxxx0
锄禾日当午0
xxxx1
锄禾日当午1
xxxx2
锄禾日当午2
xxxx3
锄禾日当午3
锄禾日当午4
锄禾日当午5
锄禾日当午6
锄禾日当午7
锄禾日当午8
锄禾日当午9
xxxx4
xxxx5
xxxx6
xxxx7
xxxx8
xxxx9
我们可以看到,在执行主程序的for循环中,也执行了MyThread类中重写的run()方法,说明创建的线程成功运行。
实现Runnable接口创建多线程
实现接口中的run()方法,用于执行线程。将Runnable对象传入Thread构造方法中,调用start()方法启动线程。
下面用一段代码演示:
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("窗前明月光"+i);
}
}
}
程序入口代码如下:
public class RunnableTest {
public static void main(String[] args) {
//创建Runnable()实例
MyRunnable r = new MyRunnable();
//创建线程对象
Thread t = new Thread(r);
t.start();
for (int i = 0; i < 10; i++) {
System.out.println("Moonlight"+i);
}
}
}
实现Runnable 与 继承Thread 对比有如下优势:
- 适合多个相同程序代码的线程取处理同一个资源的情况,把线程与程序代码、数据有效的分离,很好体现面向对象的设计思想。
- 可以避免由于Java单继承带来的局限性。开发中常碰到这种情况,就是使用一个已经继承某一个类的子类创建线程,由于一个类不能同时有两个父类,所以不能用继承Thread类的方式,只能实现Runnable接口的方式。
- 后续学习的线程池技术,接收Runnable类型的"任务",不接受Thread类型的线程。
通过匿名内部类创建Thread对象
通过匿名内部类,我们可以更简便的创建并启动线程。
public static void main(String[] args) {
// MyThread m = new MyThread();
// m.start();
new Thread() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("锄禾日当午" + i);
}
}
}.start();
for (int i = 0; i < 10; i++) {
System.out.println("xxxx" + i);
}
}
运行结果如下:
锄禾日当午0
xxxx0
锄禾日当午1
xxxx1
锄禾日当午2
xxxx2
锄禾日当午3
xxxx3
锄禾日当午4
xxxx4
锄禾日当午5
xxxx5
锄禾日当午6
xxxx6
锄禾日当午7
xxxx7
锄禾日当午8
xxxx8
锄禾日当午9
xxxx9