知道怎么使用之后我们来看看JDK中实现多线程的方式。
Thread类
先看看Thread类的开头
public
class Thread implements Runnable
从此可见,JDK中的Thread类实际上还是实现了Runnable方法的。
接下来是Thread中的run方法
public void run() {
if (target != null) {
target.run();
}
}
terget是一个Runnable类型的变量,在构造方法中被初始化,这也是我们使用Runnable接口的方式
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
接下来我们来看看start方法,里面有一些不懂得暂时不用管他
public synchronized void start() {
if (threadStatus != 0)
throw new IllegalThreadStateException();
group.add(this);
boolean started = false;
try {
start0();
started = true;
} finally {
try {
if (!started) {
group.threadStartFailed(this);
}
} catch (Throwable ignore) {
}
}
}
这里我们看到其调用了start0方法,这个方法是一个native方法,也就是这里使用了系统调用。
构造方法
先来看看构造方法:
public Thread()
public Thread(Runnable target)
Thread(Runnable target, AccessControlContext acc)
public Thread(ThreadGroup group, Runnable target)
public Thread(String name)
public Thread(ThreadGroup group, String name)
public Thread(Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name)
public Thread(ThreadGroup group, Runnable target, String name, long stackSize)
限于篇幅的关系,我们这里只介绍一些构造方法。
public Thread()
很简单的默认构造方法,一般是Thread t=new Thread();用来new一个Thread的线程实例public Thread(Runnable target)
这个构造方法就是为了实现Runnable下的多线程用的。通过这个方法可以调用Runnable中的run方法。public Thread(String name)
这个构造方法会给Thread类new出的实例起一个名字。public Thread(Runnable target, String name)
Runnable下使用多线程并给其起一个名字。
多线程的执行顺序
在并发程序设计中,由于要关注到流水线的效率,会乱序执行,在Java多线程中,每个线程也不是按照顺序执行的。
public class Main {
public static void main(String[] args){
Thread thread=new Thread(new Runnable() {
public void run() {
System.out.println("hello");
}
});
thread.start();
System.out.println("Main");
}
}
以上程序的运行结果会出现:
Main
hello
这就说明在多线程中,代码运行的结果与代码被调用的顺序是无关的。以下程序更能
说明:
public class Main {
public static void main(String[] args){
Thread thread1=new Thread(new TheThread());
Thread thread2=new Thread(new TheThread());
Thread thread3=new Thread(new TheThread());
thread1.start();
thread2.start();
thread3.start();
}
}
class TheThread implements Runnable{
public void run() {
for(int i=0;i<10;i++)
System.out.println(Thread.currentThread().getId()+":"+i);
}
}
以上程序的运行结果可以自己证明。