一 概念
- 進程:當前正在運行的應用程序,應用程序在內存中的執行區域
線程:進程的一個執行控制單元,執行路徑
一鍵加速,釋放相關進程佔用的內存(可以勾選要關閉的進程)
2. 進程與線程的關係
一個進程可以有多個線程
通過線程來運行程序
舉個多線程例子 :①比如軟件公司(進程)接了一個項目,但是實際幹活的是公司裏面的程序員(線程)。 ②殺毒軟件,可以邊殺毒,邊體檢,邊清理垃圾。③ 下載軟件,可以同時下載多部電影
3. 單線程與多線程
單線程:安全性高,效率低
多線程:安全性低,效率高
二 案例
1. JVM允許多線程
多線程效率高的原因:CPU執行程序是隨機的,會在多個線程之間高速切換,若一個進程有多個線程,則會增加搶到CPU執行權的概率
2.CPU爲何要隨機執行程序
使用戶感覺多個進程在同時執行,線程之間高速切換,實際上CPU只能執行一個線程。
3.編寫線程類的方法
1.繼承Thread類
2.創建Thread類,參數爲 實現Runnable接口的對象
因爲java單繼承,繼承了Thread便不能繼承其他類,所以推薦第2種方式
4. 編寫代碼:
…..第一種方式…
編寫線程類
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.結果顯示