线程(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();