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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章