轉載請標明出處:http://blog.csdn.net/wu_wxc/article/details/51764557
本文出自【吳孝城的CSDN博客】
Java中線程的實現有兩種方法
繼承Thread類
實現Runnable接口
線程的狀態
新建狀態:準備好多線程對象,執行start()方法進入就緒狀態
就緒狀態:執行run()方法,獲取CPU資源,進入到運行狀態
運行狀態:run()方法執行完成,進入終止狀態,若線程阻塞時讓出CPU資源,進入阻塞狀態
阻塞狀態:暫時停止運行
終止狀態:線程銷燬
線程中一些比較常用的方法:
1.start():使線程開始執行,Java虛擬機調用run方法
2.setName(String name):改變線程名字的方法
3.getName():獲得線程名字的方法
4.join():線程強行運行的方法
5.sleep():線程休眠
6.isAlive():判斷線程是否存在
線程的優先級
優先級最大值10,正常5,最小1,但不一定是最大或最小,只是搶CPU資源概率高點而已
1:Thread.MIN_PRIORITY
5:NORM_PRIORITY
10:Thread.MAX_PRIORITY
線程的運行不是通過調用run方法,而是通過調用start()方法來運行的
下面是繼承Thread類的例子
ThreadTest.java
package cn.wuxiaocheng;
public class ThreadTest {
public static void main(String[] args) {
MyThread m1 = new MyThread("A");
MyThread m2 = new MyThread("B");
m1.start();
m2.start();
}
}
MyThread.java
package cn.wuxiaocheng;
public class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(name + ":" + i);
}
super.run();
}
}
實現Runnable方法的線程
ThreadTest.java
package cn.wuxiaocheng;
public class ThreadTest {
public static void main(String[] args) {
MyRunnable m1 = new MyRunnable("A");
MyRunnable m2 = new MyRunnable("B");
// 通過實現Runnable的線程是沒有start方法的,
// 所以還是要通過創建Thread方法要調用
Thread t1 = new Thread(m1);
Thread t2 = new Thread(m2);
t1.start();
t2.start();
}
}
MyRunnable.java
package cn.wuxiaocheng;
public class MyRunnable implements Runnable {
private String name;
public MyRunnable(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(name + ":" + i);
}
}
}
結果都如下圖
同步
在線程的使用中,還會用到同步,同步可以解決資源共享問題,如賣車票,同步了纔不會出現車票賣完了還能賣的現象
同步的代碼塊格式
synchronized(同步對象){
需要同步的代碼塊
}
同步方法格式
synchronized void 方法名稱(){}
如:
ThreadTest.java
package cn.wuxiaocheng;
public class ThreadTest {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
// 假設兩個窗口在賣車票
Thread t1 = new Thread(myRunnable);
Thread t2 = new Thread(myRunnable);
Thread t3 = new Thread(myRunnable);
t1.start();
t2.start();
t3.start();
}
}
MyRunnable.java
package cn.wuxiaocheng;
public class MyRunnable implements Runnable {
private int ticket = 5;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
synchronized (this) {
if (ticket > 0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("車票:" + ticket--);
}
}
}
}
}
沒有同步的結果
添加同步的結果
線程死鎖
舉個例子,如A有一個草果,B有一梨,A對B說你先把梨給我我就給你蘋果,B對A說你先把蘋果給我就給你蘋果。這時雙方就成了死鎖狀態,只要有一方降低需求,就能達成互換狀態