1.多線程之線程狀態(tài)
先看一下我網(wǎng)上找到的圖:

Paste_Image.png
- new
線程被創(chuàng)建出來,通過new Thread();就是創(chuàng)建了一個(gè)線程,這個(gè)時(shí)候創(chuàng)建的線程并沒有執(zhí)行。 - runnable
表示可以執(zhí)行的,也就是調(diào)用了start()方法,調(diào)用了start()并不是說線程就運(yùn)行了,而是需要等操作系統(tǒng)的調(diào)度,也就是時(shí)間片的輪轉(zhuǎn)。 - running
這個(gè)時(shí)候表示線程已經(jīng)在執(zhí)行了,也就是獲得了時(shí)間片,在運(yùn)行的過程中可能有一些情況會(huì)讓出CPU,線程會(huì)進(jìn)入另外一種狀態(tài)。
- 當(dāng)前線程高風(fēng)亮節(jié)讓出CPU,也就是調(diào)用yeild()方法,是當(dāng)前線程回到runnable狀態(tài)。
2)當(dāng)前線程調(diào)用了sleep(),線程進(jìn)入了wait狀態(tài),也就是圖上所說的blocked();如果線程調(diào)用join()也是類似情況
3)當(dāng)前線程遇到同步代碼塊,或者同步方法(synchronized)線程會(huì)進(jìn)入blocked狀態(tài);如果線程被wait()也也進(jìn)入blocked狀態(tài)。
- blocked
這個(gè)時(shí)候表示線程被阻塞了,阻塞的情況有很多,可能sleep(),wait(),synchronized等等。 - dead
當(dāng)前線程執(zhí)行完了,或者異常退出了。
2.多線程之創(chuàng)建線程
多線程有兩種創(chuàng)建方式:
- implement runnable
//通過實(shí)現(xiàn)的方式
static class MyThread1 implements Runnable {
public void run() {
System.out.println("this is implements two method....");
}
}
- extends Thread
//通過繼承的方式
static class MyThread extends Thread {
public void run() {
System.out.println("this is extends thread one method.....");
}
}
Thread 和Runnable區(qū)別:
- runnable 比thread靈活,因?yàn)镴ava是單繼承的,但是Java可以實(shí)現(xiàn)多個(gè)接口。
- runnable可以實(shí)現(xiàn)資源共享
例如:
package com.yuxi;
/**
* Created by yuxi on 17/1/26.
*/
public class MyThread {
public static void main(String[] args) {
MyThreadOne myThreadOne1 = new MyThreadOne();
myThreadOne1.start();
MyThreadOne myThreadOne2 = new MyThreadOne();
myThreadOne2.start();
MyThreadOne myThreadOne3 = new MyThreadOne();
myThreadOne3.start();
MyThreadTwo myThreadTwo = new MyThreadTwo();
Thread thread1 = new Thread(myThreadTwo);
Thread thread2 = new Thread(myThreadTwo);
Thread thread3 = new Thread(myThreadTwo);
thread2.start();
thread1.start();
thread3.start();
}
static class MyThreadOne extends Thread {
private int ticket=10;
public void run() {
for (int i = 0; i < 20; i++) {
if (ticket>0) {
System.out.println("當(dāng)前" + Thread.currentThread().getName() + "買了" + (ticket--) + "票");
}
}
}
}
static class MyThreadTwo implements Runnable {
private int ticket=10;
public void run() {
for (int i = 0; i < 20; i++) {
if (ticket>0) {
System.out.println("當(dāng)前" + Thread.currentThread().getName() + "買了" + (ticket--) + "票");
}
}
}
}
}
如果是extends結(jié)果是:
當(dāng)前Thread-0買了10票
當(dāng)前Thread-0買了9票
當(dāng)前Thread-0買了8票
當(dāng)前Thread-0買了7票
當(dāng)前Thread-0買了6票
當(dāng)前Thread-0買了5票
當(dāng)前Thread-0買了4票
當(dāng)前Thread-0買了3票
當(dāng)前Thread-0買了2票
當(dāng)前Thread-0買了1票
當(dāng)前Thread-1買了10票
當(dāng)前Thread-1買了9票
當(dāng)前Thread-1買了8票
當(dāng)前Thread-1買了7票
當(dāng)前Thread-1買了6票
當(dāng)前Thread-1買了5票
當(dāng)前Thread-1買了4票
當(dāng)前Thread-1買了3票
當(dāng)前Thread-1買了2票
當(dāng)前Thread-1買了1票
當(dāng)前Thread-2買了10票
當(dāng)前Thread-2買了9票
當(dāng)前Thread-2買了8票
當(dāng)前Thread-2買了7票
當(dāng)前Thread-2買了6票
當(dāng)前Thread-2買了5票
當(dāng)前Thread-2買了4票
當(dāng)前Thread-2買了3票
當(dāng)前Thread-2買了2票
當(dāng)前Thread-2買了1票
如果是implement結(jié)果是:
當(dāng)前Thread-1買了10票
當(dāng)前Thread-0買了9票
當(dāng)前Thread-1買了8票
當(dāng)前Thread-0買了7票
當(dāng)前Thread-0買了5票
當(dāng)前Thread-1買了6票
當(dāng)前Thread-1買了3票
當(dāng)前Thread-1買了2票
當(dāng)前Thread-0買了4票
當(dāng)前Thread-2買了1票
原因是因?yàn)椋?br>
MyThreadTwo myThreadTwo = new MyThreadTwo();
這個(gè)對(duì)于啟動(dòng)的三個(gè)線程是共享的,他的成員變量 private int ticket=10;是公共資源存在競(jìng)爭(zhēng)。
MyThreadOne myThreadOne1 = new MyThreadOne();
MyThreadOne myThreadOne2 = new MyThreadOne();
MyThreadOne myThreadOne3 = new MyThreadOne();
分別啟動(dòng)了三個(gè),這三個(gè)之間是不存在競(jìng)爭(zhēng)的。