
💐个人主页:初晴~
上篇文章我们简单介绍了什么是进程与线程,以及他们之间的区别与联系,实际应用中还是以多线程编程为主的,所以这篇文章就让我们更加深入地去剖析多线程编程的具体应用吧
目录
一、初识Thread类
1、创建线程
(1)继承Thread类
编写的MyThread需要继承Thread类,不需要导包,因为Thread类是java.lang中内置的类。
继承不是主要目的,主要是为了重写Thread类中的run方法,在其中写入所创建线程需要执行的逻辑语句。
若要让线程运行,需先实例化编写的MyThread类,接着调用start方法就会在进程内部创建一个新的线程,新的线程就会执行刚才run里的代码。
具体代码如下:
class MyThread extends Thread{
//重写run方法
@Override
public void run(){
//线程执行的逻辑
System.out.println("Hello World!");
}
}
public class Main {
public static void main(String[] args) {
MyThread myThread=new MyThread();
//创建线程
myThread.start();
}
}

class MyThread extends Thread{
//重写run方法
@Override
public void run(){
while (true){
System.out.println("Hello thread");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
public class Main {
public static void main(String[] args) {
MyThread t=new MyThread();
//创建线程
t.start();
while (true){
System.out.println("Hello main");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}

注意:
上述代码中,并没有直接手动调用run方法,但是也被执行了。像run这种,用户手动定义了,但是没有手动调用,最终被系统/库/框架调用执行了的方法,被称为“回调函数(call back)”。
(2)实现Runnable接口
class MyRunnable implements Runnable{
@Override
public void run() {
System.out.println("Hello Runnable!");
}
}
public class Main {
public static void main(String[] args) {
MyRunnable runnable=new MyRunnable();
Thread myThread=new Thread(runnable);
//创建线程
myThread.start();
}
}
通过Thread创建线程,而线程要执行的任务是通过Runnable来描述的,而不是通过Tread自己来描述,这样能起到一定的“解耦合”的作用,便于代码后期维护。
Runnable只是描述了一个任务,并不与“线程”强相关,后续执行这个任务的载体可以是线程,也可以是其他东西,比如线程池、虚拟线程(协程)等,一定程度上提高了代码的复用率。
对⽐上⾯两种⽅法:• 继承 Thread 类, 直接使⽤ this 就表⽰当前线程对象的引⽤.• 实现 Runnable 接⼝, this 表⽰的是 MyRunnable 的引⽤. 需要使⽤Thread.currentThread()
(3)匿名内部类
匿名指没有类名,内部类指定义在其它类内部的类,匿名内部类一般就是“一次性”使用的类,用完就丢掉,相对来说内聚性会更好一些
// 使⽤匿名类创建 Thread ⼦类对象
Thread t=new Thread(){
@Override
public void run() {
System.out.println("使⽤匿名类创建 Thread ⼦类对象");
}
};
1、定义匿名内部类,这个类是Thread的子类2、类的内部,重写了父类的run方法3、创建了一个子类的实例,并把实例的引用赋值给了t
//使⽤匿名类创建 Runnable ⼦类对象
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
System.out.println("使⽤匿名类创建 Runnable ⼦类对象");
}
});
lambda表达式创建 Runnable 子类对象:
Thread t3=new Thread(()-> System.out.println("使⽤lambda表达式创建 Runnable ⼦类对象"));
Thread t4=new Thread(()->{
System.out.println("使用lambda表达式创建 Runnable 子类对象");
});
lambda表达式本质上就是匿名内部类的更简化的写法,很多时候,写匿名内部类都不是为了写“类”,而是写类中的“方法”,而lambda就可以避开类而直接描述其中的run方法

最低0.47元/天 解锁文章
553





