一、作用
多线程,可以真正发挥出多核CPU的优势来,提高cpu的利用率,达到充分利用CPU的目的。(java 根据线程优先级进行抢占式调度)
二、实现方式
多线程主要有两种实现方式、分别是继承Thread类和实现Runnable接口作为宿主。
1、继承Thread接口、重写run方法
public class Thread2 {
public static void main (String[] args) {
Thread t1 = new Thread(){
@Override
public void run () {
System.out.println(" thread:"+Thread.currentThread().getName());
}
};
t1.start();
}
}
输出:thread:Thread-0
2、实现Runnable接口作为宿主
public class Thread2 {
public static void main (String[] args) {
//2、实现Runnable接口作为宿主
Thread t2 = new Thread(new Runnable() {
@Override
public void run () {
System.out.println(" runnable:"+Thread.currentThread().getName());
}
});
t2.start();
}
}
输出: runnable:Thread-0
使用方式2实现的优势:
1)适合多个相同的程序代码的线程去处理同一个资源
2)可以避免Java中的单继承的限制
三、启动
我们重写的run方法、是线程执行的具体业务。也就是线程体。但是在启动线程的时候需要调用Thread的start方法。
public synchronized void start() {
/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/
if (threadStatus != 0 || this != me)
throw new IllegalThreadStateException();
group.add(this);
start0();
if (stopBeforeStart) {
stop0(throwableFromStop);
}
}
private native void start0();
上面的代码片段来子Thread类,可以看出里面调用了start0() 这个方法。这个方法是本地的其他语言实现的方法(据说是C语言),这个方法会调用底层系统启用线程。并且
start0,此方法会让JVM调用线程的run方法。如果直接调用run方法,就会被当做一个普通的方法调用。不会实现多线程。
当使用继承Thread类的时候,重写了Thread的run方法。所以直接调用我们所写的线程体。当使用 实现Runnable接口作为宿主的使用调用Thread的run方法
public void run() {
if (target != null) {
target.run();
}
}
再调用target的(也就是我们传入的Runnable)的run方法。
记录一下、方便日后查看。