线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。同一进程中的多条线程将共享该进程中的全部系统资源。
源码浅析
Runnable源码
Runnable是个空接口,只有一个抽象方法run();
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Thread源码截取
Thread类是线程运行的入口;
通过start()方法唤醒线程;
public class Thread implements Runnable {
/* What will be run. */
private Runnable target; //rannable参数
public Thread() {
init(null, null, "Thread-" + nextThreadNum(), 0);
}
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
@Override
public void run() {
if (target != null) {
target.run();
}
}
}
分析
Tread.start()会唤醒线程,随后线程会执行自己的run方法;
跟踪源码我发现;start()调用了一个native方法start0();
所以start()是如何调用run()的,我们无从得知了;
回到run()方法上
target是Thread类的Runnable属性;
如果Thread对象持有一个Runnable实现类的对象,
这里调用的就是该对象的run方法;
@Override
public void run() {
if (target != null) {
target.run();
}
}
从Tread类到创建多线程
Java中有2种创建多线程的方式:
1、继承Thread类
继承Thread类,重写了run方法,则执行的是Thread子类的run方法;
Thread子类
public class TestThread extends Thread{
@Override
public void run() {
System.out.println('继承Thread类');
}
}
Tread t=new TestThread ();
t.start();
2、实现Runable接口
实现Runable接口,创建Thread对象时传入Runnable的实现类,则执行的是该实现类的run方法;
Rannable接口实现类
public class TestRunnable implements Runnable{
@Override
public void run() {
System.out.println('实现Runable接口');
}
}
TestRunnable runnable=new TestRunnable();
Tread t=new Thread(runnable);
t.start();
无论是哪种方法,切入点都是Thread类,区别是:
继承Thread类的顺序是:
Thread.start()→Thread.run()
实现Runable接口顺序是:
Thread.start()→Thread.run()→Runable.run()
所以说Thread类是线程的入口;
其他
匿名内部类 方式
调用Thread有参构造器,传入一个Runnable实例;
(Runnable是接口,所以这里要求重写它的所有方法;)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类方式");
}
}).start();
lambda表达式 方式
new Thread(()-> {
System.out.println("lambda表达式方式");
}).start();
本文详细解析了Java中线程的创建和执行过程,包括通过继承Thread类和实现Runnable接口两种方式,并深入探讨了Thread类和Runnable接口的源码,以及线程启动和run方法的执行流程。

578

被折叠的 条评论
为什么被折叠?



