1. 程式人生 > >Java執行緒操作

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說你先把蘋果給我就給你蘋果。這時雙方就成了死鎖狀態,只要有一方降低需求,就能達成互換狀態