说到线程,第一个想到的肯定是Thread
了,而Thread
是一个实现了Runnable
接口的类而已。下面我们一起来看一下:
Runnable
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
Runnable是一个只有 run() 方法的接口。
Thread
Thread 中的构造方法中,我们常用到的是前四个
- public Thread();
- public Thread(Runnable target);
- public Thread(String name);
- public Thread(Runnable target, String name);
其中,target参数表示创建线程时传递的哪个Runnable对象,那么这个线程开启后执行的就是该Runnable的run()方法。name参数可以手动来指定创建的线程的名称,如果不指定,则默认是Thread-序号
的形式,具体数值由nextThreadNum()
方法来计数确定。
无论我们调用的是哪个构造函数,内部最终都调用了private void init(ThreadGroup g, Runnable target, String name, long stackSize)
方法。
private void init(ThreadGroup g, Runnable target, String name, long stackSize) {
··· 省略代码 ···
this.target = target; // 把传递进来的Runnable对象保存下来
··· 省略代码 ···
}
public void run() {
if (target != null) {
target.run(); // target不为空,则调用其run()方法
}
}
最后我们通过Thread类中的 start() 方法来启动我们创建的线程
public synchronized void start() {
··· 省略代码 ···
started = false;
try {
nativeCreate(this, stackSize, daemon); // 通过本地方法完成线程的启动
started = true;
} finally {
··· 省略代码 ···
}
}
最终通过本地方法来完成线程的创建和启动。
private native static void nativeCreate(Thread t, long stackSize, boolean daemon);
创建线程时,我们把需要并行处理的代码放在 run() 方法中,通过 start() 方法启动线程将自动调用 run() 方法,这是由 jvm 的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。
Thread中常用方法:
- start();//启动线程
- getId();//获得线程ID
- getName();//获得线程名字
- getPriority();//获得优先权
- isAlive();//判断线程是否活动
- isDaemon();//判断是否守护线程
- getState();//获得线程状态
- sleep(long mill);//休眠线程
- join();//等待线程结束
- yield();//放弃cpu使用权利
- interrupt();//中断线程
- currentThread();//获得正在执行的线程对象