總覺的自己還有好多的東西還不懂,便很急促的學這學那沒有方向,殊不知實質浪費了多少時間。 今天學習了多線程,來總結一下 多線程基礎 先聊一下什麼叫做進程。 在操作系統中,同時有許多個進程在運行,他們依照優先順序排列,依次占用資源來運行。一個進程由多個線程組成。Java在運行的時啟動JVM,每個JVM相當 ...
總覺的自己還有好多的東西還不懂,便很急促的學這學那沒有方向,殊不知實質浪費了多少時間。
今天學習了多線程,來總結一下
多線程基礎
先聊一下什麼叫做進程。
在操作系統中,同時有許多個進程在運行,他們依照優先順序排列,依次占用資源來運行。一個進程由多個線程組成。
Java在運行的時啟動JVM,每個JVM相當於是一個進程,而其中至少會有倆個線程啟動,分別是GC(垃圾回收機制),主線程(main)
多線程的倆種實現方法
1.繼承Thread類,重寫run()方法,利用該類中的start()方法來啟動線程
class MyThread extends Thread{ //本質上Thread類是Runnable的實現類 但是單繼承擴展性不好
String name;
int tacket = 5;
public MyThread(String name) {
this.name = name;
}
public void run() { //創建線程需要對run方法進行重寫
while(tacket!=0){
System.out.println(name+tacket--);
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThread mt = new MyThread("線程A"); //參數為線程名
MyThread mt1 = new MyThread("線程B");
mt.start(); //調用start方法自動調用run方法
mt1.start();
}
}
2.實現Runnable介面,必須重寫run()方法,在利用Thread類的構造函數傳入實現介面的引用,最後調用屬於Thread類的start()方法啟動
class Mythread1 implements Runnable{
int tacket = 5;
static String str ="";
public void run() {
// TODO Auto-generated method stub
while(tacket!=0){
str += Thread.currentThread().getName()+tacket--+"\n";
}
}
}
public class RunnableDemo {
public static void main(String[] args) {
Mythread1 mt = new Mythread1();
Thread t = new Thread(mt,"線程A");
Thread t1 = new Thread(mt,"線程B");
Thread t3 = new Thread(mt);
t.start(); //調用start方法 CPU對線程進行調度 然後執run方法運行
t1.start();
}
}
倆種方法的比較
目前開發一般會使用第二種,也就是實現Runnable介面主要是有倆個原因
1.繼承Thread是單繼承,而實現Runnable介面提高了程式的可擴展性
2.實現Runnable介面可以資源實現共用
線程的狀態:創建,就緒,運行,阻塞,終止
介紹一些線程的常用操作
static Thread currentThread()返回對當前正在執行的線程對象的引用。
String getName() 返回該線程的名稱。
int getPriority()
返回線程的優先順序。
主線程的優先順序為5,最高優先順序為10,最低優先順序為1。
boolean isAlive()
測試線程是否處於活動狀態。
static void sleep(long millis)
在指定的毫秒數內讓當前正在執行的線程休眠(暫停執行),此操作受到系統計時器和調度程式精度和準確性的影響。
static void yield()
暫停當前正在執行的線程對象,並執行其他線程。
同步和死鎖
資源共用時候使用同步(Synchronization),有倆種同步方法:
1.同步代碼塊 2.同步方法
同步代碼塊的效率要高於同步方法
同步方法直接在方法上加synchronized實現加鎖,同步代碼塊則在方法內部加鎖。
很明顯,同步方法鎖的範圍比較大,而同步代碼塊範圍要小點,一般同步的範圍越大,性能就越差,一般需要加鎖進行同步的時候,肯定是範圍越小越好,這樣性能更好。
在程式中過多的同步會發生死鎖現象,及倆個線程一直處於相互等待狀態,如果沒有外力干擾會一直等待下去