Java學習----多線程

一 概念

  1. 進程:當前正在運行的應用程序,應用程序在內存中的執行區域
    線程:進程的一個執行控制單元,執行路徑
    這裏寫圖片描述
    一鍵加速,釋放相關進程佔用的內存(可以勾選要關閉的進程)

2. 進程與線程的關係

一個進程可以有多個線程

通過線程來運行程序
舉個多線程例子 :①比如軟件公司(進程)接了一個項目,但是實際幹活的是公司裏面的程序員(線程)。 ②殺毒軟件,可以邊殺毒,邊體檢,邊清理垃圾。③ 下載軟件,可以同時下載多部電影

3. 單線程與多線程

單線程:安全性高,效率低
多線程:安全性低,效率高

二 案例

1. JVM允許多線程

多線程效率高的原因:CPU執行程序是隨機的,會在多個線程之間高速切換,若一個進程有多個線程,則會增加搶到CPU執行權的概率

2.CPU爲何要隨機執行程序

使用戶感覺多個進程在同時執行,線程之間高速切換,實際上CPU只能執行一個線程。

3.編寫線程類的方法

1.繼承Thread類

2.創建Thread類,參數爲 實現Runnable接口的對象
因爲java單繼承,繼承了Thread便不能繼承其他類,所以推薦第2種方式

4. 編寫代碼:

…..第一種方式
這裏寫圖片描述

  1. 編寫線程類

package com.blueSky.threadDemo;

public class MyThread extends Thread{

    @Override    //重寫run()方法
    public void run() {
        for(int i=0;i<50;i++){
            System.out.println(this.getName()+"   "+ i); //輸出當前線程對象的名字 和 變量i的值
        }
    }
}

2.編寫測試類 main法中創建線程對象進行測試

 package com.blueSky.threadDemo;

public class ThreadTest {
    public static void main(String[] args) {
        MyThread myThread01 = new MyThread();  //創建第一個線程對象 
        myThread01.setName("線程A");           //設置線程的名字
        myThread01.start();                    //啓動該線程

        MyThread myThread02 = new MyThread();  //創建第二個線程對象
        myThread02.setName("線程B");             //設置線程的名字
        myThread02.start();                     //啓動線程
    }
}   

3.運行結果

這裏寫圖片描述
若多個線程去修改一個變量,明顯會提高運行效率,但是要注意共享數據
變量的值也可以從數據庫獲得。
main方法是單線程的。

…..第二種方式…
這裏寫圖片描述
1.編寫MyThread2類,實現Runnable接口,重寫run方法

package com.blueSky.threadDemo2;
/*
 *  Thread.currentThread();    //靜態方法  返回當前進程對象的引用
 * 
 * */
public class MyThread2 implements Runnable{
    private int count = 100 ;
    @Override
    public void run() {
        Thread thread = Thread.currentThread();    //返回當前進程對象的引用
        for(int i=0;i<=99;i++){
            if(count==0){
                break;
            }
            System.out.println( thread.getName() +"   " + (--count));
        }
    }

}

2.編寫測試類,創建Thread對象,構造器參數爲myThread2對象

package com.blueSky.threadDemo2;

public class Thread2Test {
    public static void main(String[] args) {
        //創建Thread類,構造函數 參數爲實現Runnable接口的對象

        MyThread2 myThread01 = new MyThread2();   //創建MyThread對象
        Thread thread1 = new Thread(myThread01);   //創建Thread對象,參數爲Runnable接口類型
        thread1.setName("線程1");
        thread1.start();

        Thread thread2 = new Thread(myThread01);  //創建Thread對象 ,構造器參數爲myThread01
        thread2.setName("線程2");
        thread2.start();

    }
}

3.結果顯示
這裏寫圖片描述

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