目录
1 继承java.lang.Thread类
1.1 创建步骤
- 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体;
- 创建Thread子类的实例,即创建了线程对象;
- 调用线程对象的start()方法来启动该线程。
1.2 代码示例
public class MyThread extends Thread {
//定义指定线程名称的构造方法
public MyThread(String name) {
//调用父类的String参数的构造方法,指定线程的名称
super(name);
}
// 重写run方法,完成该线程执行的逻辑
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+":正在执行!"+i);
}
}
}
public class Demo {
public static void main(String[] args) {
//创建自定义线程对象
MyThread t = new MyThread("新的线程");
//开启新线程
t.start();
//在主方法中执行for循环
for (int i = 0; i < 1000; i++) {
System.out.println("main线程"+i);
}
}
}
...
main线程318
main线程319
新的线程:正在执行!0
新的线程:正在执行!1
新的线程:正在执行!2
新的线程:正在执行!3
新的线程:正在执行!4
...
2 实现java.lang.Runnable接口
2.1 创建步骤
- 定义Runnable接口的实现类,并重写该接口的run()方法,该run()方法的方法体同样是该线程的线程执行体;
- 创建Runnable实现类的实例;
- 创建Thread类的实例并传入Runnable实现类的实例,该Thread对象才是真正的线程对象;
- 调用线程对象的start()方法来启动线程;
2.2 代码示例
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i < 20; i++) {
System.out.println(Thread.currentThread().getName()+" "+i);
}
}
}
public class Demo {
public static void main(String[] args) {
//创建自定义类对象 线程任务对象
MyRunnable mr = new MyRunnable();
//创建线程对象
Thread t = new Thread(mr, "小强");
t.start();
for (int i = 0; i < 20; i++) {
System.out.println("旺财 " + i);
}
}
}
...
旺财 12
旺财 13
旺财 14
小强 0
小强 1
小强 2
...
3 实现Runnable接口比继承Thread类的优势
- 可以避免java中的单继承的局限性;
- 增加程序的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立;
- 线程池只能放入实现Runable或Callable类线程,不能直接放入继承Thread的类;
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个JVM其实在就是在操作系统中启动了一个进程。
4 匿名内部类方式实现多线程的创建
- 使用线程的匿名内部类方式,可以方便地实现每个线程执行不同的线程操作;
- 使用匿名内部类的方式实现Runnable接口,重写Runnable接口中的run方法。
代码示例如下:
public class NoNameInnerClassThread {
public static void main(String[] args) {
/* new Runnable(){
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("张宇:"+i);
}
}
};
*/
//‐‐‐这个整体 相当于new MyRunnable()
Runnable r = new Runnable(){
public void run(){
for (int i = 0; i < 20; i++) {
System.out.println("张宇:"+i);
}
}
};
new Thread(r).start();
for (int i = 0; i < 20; i++) {
System.out.println("费玉清:"+i);
}
}
}
...
费玉清:10
费玉清:11
费玉清:12
张宇:0
张宇:1
张宇:2
...