Java執行緒操作
轉載請標明出處: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說你先把蘋果給我就給你蘋果。這時雙方就成了死鎖狀態,只要有一方降低需求,就能達成互換狀態