JAVA线程
什么是线程?
- 线程是一个程序内部的一条执行流程
public static void main(String[] args) {
// 代码...
for (int i = 0; i < 10; i++) {
System.out.println(i);
}
// 代码...
}
- 程序中如果只有一条执行流程,那这个程序就是单线程的程序
什么是多线程?
- 多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)
**例:百度网盘能够同时上传和下载文件,因此百度网盘在后台肯定要提供两条执行流程,一个用来上传,另一个用来下载。**这就是多线程模式。
如何在程序中创建出多条线程?
- java是通过java.lang.Thread类的对象来代表线程的。
- 有两种方法可以创建新的执行线程,一种是将类声明为Thread类的子类,此子类应该覆盖Thread的run方法,然后可以分配和启动子类的实例;另一种方法是声明一个实现Runnable接口的类,该类实现run方法,再分配类的实例。
方法一创建线程
- 定义一个子类MyThread继承线程类Thread,重写run()方法
- 创建MyThread类的对象
- 调用线程对象的start()方法启动线程(启动后还是执行run方法)
优点:编码简单
缺点:线程类已经继承Thread,无法继承其他类,不利于功能的扩展
注意
1.启动线程必须是调用start()方法,不是调用run方法。
若调用的run方法,在主线程main中会将子类当作一个普通对象调用其方法,而不是另外开一个线程。
2.不要把主线程任务放在启动子线程之前(否则每次都是主线程先执行完,再启动子线程,就不是多线程了)。
方法二创建线程
-
定义一个线程任务类MyRunnable实现Runnable接口,重写run()方法
-
创建MyRunnable任务对象(注意任务对象并不是线程对象)
-
把MyRunnable任务对象交给Thread处理
// 封装Runnable对象称为线程对象 public Thread(Runnable target)
-
调用线程对象的start()方法启动线程
优点:任务类只是实现接口,可以继续继承其他类、实现其他接口,扩展性强
缺点:需要多创建一个Runnable对象
方法二的匿名内部类写法
- 创建Runnable的匿名内部类对象
- 交给Thread线程对象
- 调用线程对象的start()启动线程
以下面代码为例
package Thread;
public class ThreadTest2_2 {
public static void main(String[] args) {
// 创建Runnable的匿名内部类
Runnable target = new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("子线程1:" + i);
}
}
};
new Thread(target).start();
// 简化形式1,直接在Thread构造函数中传入匿名内部类
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("子线程2:" + i);
}
}
}).start();
// 由于Runnable是函数式接口,所以可以用lambda表达式简化
new Thread(() -> {
for (int i = 1; i <= 5; i++) {
System.out.println("子线程3:" + i);
}
}).start();
for (int i = 1; i <= 5; i++) {
System.out.println("主线程:" + i);
}
}
}