Java中的多线程是个很复杂的话题,自己也一直感觉有必要写些博客来梳理这些知识点,所以写下这篇文章来记录。
Java线程并发是通过共享内存实现的,理解此模型比较重要,这个会让我们对多线程的通信有很直观的理解。
一:线程的创建
Java中线程的创建有两种方式,即:
1:继承Thread类 2:实现Runnable接口
看看Java给我们提供的常见api吧
Thread():创建一个新的Thread对象
Thread(Runnable target):根据给定的实现Runnable的对象创建一个新的Thread对象
Thread(Runnable target,String name):如上,并且为线程指定了名字
我们创建线程的常见方式如下:
//first method
Thread t1 = new Thread("Thread name");
t1.start();
//second method
Thread t2 = new Thread(){
@Override
public void run() {
//doSomething
}
};
t2.start();
//third method
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
//dosomething
}
},"thread name");
t3.start();
二:Thread和Runnable的联系
看Java源码:
public class Thread implements Runnable {
/* Make sure registerNatives is the first thing <clinit> does. */
Thread实现了Runable接口,而Runnable接口中只有一个方法就是public abstract void run();,所以我们任何实现Runnable的类都必须重写run方法。那么毫无例外,Thread类也必须重写run方法,那么继续看源码
@Override
public void run() {
if (target != null) {
target.run();
}
}
由上我们可以看出,Thread调用了一个target的run方法,而这个target就是我们传递进去的Runnable对象。
private Runnable target;
public Thread(Runnable target) {
init(null, target, "Thread-" + nextThreadNum(), 0);
}
private void init(ThreadGroup g, Runnable target, String name,
long stackSize) {
......
this.target = target;
......
}
所以Thread(Runnable target)实质上会优先调用target的run方法。