一、继承Thread
第一种常见创建多线程的技术:Thread
(1)继承Thread类创建线程类
通过继承Thread类创建线程类的具体步骤和具体代码如下:
• 定义一个继承Thread类的子类,并重写该类的run()方法;
• 创建Thread子类的实例,即创建了线程对象;
• 调用该线程对象的start()方法启动线程。
示例
MyThread类
package thread;
public class MyThread extends Thread {
//run方法就是线程要执行的任务方法
@Override
public void run() {
//这里的代码就是一条新的执行路径
//这个执行路径是触发方式,不是调用run方法,而是通过thread对象的start方法来启动任务
for (int i = 0; i < 10; i++) {
System.out.println("锄禾日当午"+i);
}
}
}
Demo类
package thread;
public class Demo{
public static void main(String[] args) {
MyThread m = new MyThread();
m.start();
for (int i = 0; i < 10; i++) {
System.out.println("汗滴禾下土"+i);
}
}
}
运行结果
由于是抢占式调度每次运行结果可能都不一样
二、实现Runnable
第二种常见实现多线程的技术:Runnable
(1)实现Runnable与继承Thread相比有如下优势
1.通过创建任务,然后给线程分配任务的方式实现多线程,更适合多个线程
同时执行任务的情况
2.可以避免单继承所带来的局限性
3.任务与线程是分离的,提高了程序的健壮性
4.后期学习的线程池技术,接受Runnable类型的任务,不接受Thread类型的
线程
(2)实现Runnable接口创建线程类
通过实现Runnable接口创建线程类的具体步骤和具体代码如下:
1、定义Runnable接口的实现类,并重写该接口的run()方法;
2、创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象
示例
MyRunnable类
package thread;
public class MyRunnable implements Runnable{
@Override
public void run() {
//线程的任务
for (int i = 0; i < 10; i++) {
System.out.println("锄禾日当午"+i);
}
}
}
Demo1类
package thread;
/*
实现Runnable与继承Thread相比有如下优势
1.通过创建任务,然后给线程分配任务的方式实现多线程,更适合多个线程同时执行任务的情况
2,可以避免单继承所带来的局限性
3,任务与线程是分离的,提高了程序的健壮性
4,后期学习的线程池技术,接受Runnable类型的任务,不接受Thread类型的线程
**/
public class Demo1 {
public static void main(String[] args) {
//实现runnable
//1 创建一个任务对象
MyRunnable r = new MyRunnable();
//2、创建一个线程并给他一个任务
Thread t = new Thread(r);
//3、启动线程
t.start();
for (int i = 0; i < 10; i++) {
System.out.println("汗滴禾下土"+i);
}
}
}