1. 程式人生 > >java多線程的深入分析

java多線程的深入分析

-s 6.2 判斷 info ava read 順序執行 rgs ole

1.進程與線程的區別

    1.1 進程通常是指一個應用程序,進程的啟動就意味著該改程序的主線程啟動,不同的進程擁有這不同的內存空間,而不同的線程有共享的內存空間,一個進程包含多個線程

2.java中如何創建線程

    2.1 繼承Thread類

    2.2 實現Runnable接口

3.線程中run()與start()的區別

    3.1 run方法是指一個線程要執行的內容

    3.2 start方法是指將線程的狀態變成就緒狀態,線程是否執行是取決於cup的調度

4.線程中的調度

    4.1 sleep方法:線程休眠多長時間

    4.2 join方法: 等待join方法的線程變成消亡狀態

    4.3 setPriority方法:設置線程的優先級,值越大 獲取cup調度的資源就越大

    4.4 yeild方法:線程讓步,讓當前線程變成就緒狀態,雖然說是讓步但是很有可能立即執行

    4.5 stop方法:強制停止當前線程,但是這樣做不安全,因此jdk標記成了過時方法

    4.6 interrupt方法:優雅停止線程(設置一個可以停止線程的信號,實際上停止與否應該看線程所執行的業務結果可以通過isinterrupt來判斷當前線程是否可以停止)

5.線程的狀態

    技術分享圖片

6.並行於並發

  6.1 並行真正的意義上的同時執行

  6.2 通過CPU的調度,同一時刻只有一個線程執行

7.並發帶來的問題

   多線程,原子,可見,有序,詳細講解:

    7.1 原子性:同一個線程在執行的的時候不能被其他線程打斷

    7.2 可見性:當線程改變一個值後一定要讓其他線程看到最新的結果 volitile:可見性關鍵字,保證線程一定能夠獲取到主內存最新更改的值

    7.3 即程序執行的順序按照代碼的先後順序執行

8.wait於sleep的區別

   1: wait是Object裏邊的發方法,sleep是Thread的方法

   2: wait會自動釋放鎖,sleep不會

   3: wait必須配合sychronized關鍵字一起使用

9.實現死鎖

package com.zhibo.zyw.bdnq.test;
import com.zhibo.zyw.bdnq.test.DeadLock.*;
/**
 * @program: ThreadProject
 * @author: zyw
 * @create: 2018-06-26 18:14
 **/
public class ProducerAndConsumer {


    public static void main(String[] args) {

        Thread thread1 = new Thread(new DeadLockThread(true));
        Thread thread2 = new Thread(new DeadLockThread(false));
        thread1.start();
        thread2.start();
    }
}
package com.zhibo.zyw.bdnq.test;

/**
 * @program: ThreadProject
 * @author: zyw
 * @create: 2018-06-26 18:22
 **/
public class DeadLock {
    private static Object monitor1 = new Object();
    private static Object monitor2 = new Object();

    public static class DeadLockThread implements Runnable {

        private boolean type;

        public DeadLockThread(boolean type) {
            this.type = type;
        }

        @Override
        public void run() {
            if (type) {
                synchronized (monitor1) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                synchronized (monitor2) {

                }
            } else {
                synchronized (monitor2) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                synchronized (monitor1) {

                }
            }
        }
    }
}

今天小編就先寫到這裏,有什麽疑問的可以留言歐!

java多線程的深入分析