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方法。