1. 程式人生 > >Java基礎_多線程2[線程控制]

Java基礎_多線程2[線程控制]

http 繼續 rri 就會 存在 sta current ... 睡眠


多線程2[線程控制]

1.線程調度以及設置線程優先級

(1).線程調度的倆種模型
A:分時調度模型 所有的線程輪流使用CPU的使用權,平均分配每一個線程占用CPU的時間片。

B:搶占式調度模型 優先讓優先級高的線程使用使用CPU,如果優先級相同,那麽這一個時候就會隨機的選擇一個,優先級高的線程獲取的CPU
的時間片相對多一點。
java使用的是搶占式調度模型。

(2).線程的優先級
A:獲取線程的優先級
public final int getPriority():返回線程的優先級
//默認是5

B:設置線程的優先級
public final int setPriority(int i):設置線程的優先級
//線程的優先級的取值範圍值是:1-10

異常:java.lang.IllegalArgumentException:非法參數異常,表明向方法傳遞了一個不正確的參數值

C:註意事項
線程的優先級高僅僅表示獲取CPU的時間片的幾率高,由於存在著隨機性,只有在多次測試的情況下才可以看出效果。

(3).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
mt.setName("大豬");
mt1.setName("小豬");
//設置線程優先級
mt.setPriority(10);
mt1.setPriority(1);
//獲取默認優先級
//System.out.println(mt.getPriority());
//System.out.println(mt1.getPriority());
mt.start();
mt1.start();
}
}

2.線程控制之休眠線程

(1).方法
public static void sleep(long millis);//線程休眠時間,在指定的毫秒時間內讓當前的線程"暫停一段時間"。

(2).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i+",時間是:"+new Date());
//睡眠
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大豬");
mt1.setName("小豬");
mt2.setName("胖豬");
mt.start();
mt1.start();
mt2.start();
}
}


3.線程控制之加入線程

(1).什麽時候使用加入線程
存在著先後順序的時候,可以考慮使用加入線程。也就是其中的一個線程走完了,別的線程才可以去搶CPU的使用權,這一個情況就可以使用。

(2).加入線程方法
public final void join()
throws InterruptedException:等待該線程終止


(3).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大豬");
mt1.setName("小豬");
mt2.setName("胖豬");

mt.start();
try {
mt.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
mt1.start();
mt2.start();
}
}
//結果
大豬先執行完,然後小豬和胖豬去搶cpu使用權


4.線程控制之禮讓線程

(1).禮讓線程方法
public static void yield():暫停正在執行的線程對象,並執行其他線程。


(2).禮讓線程使用條件
讓線程在一定的程度上保持和諧,也就是說A線程執行了,B線程執行,然後再A,然後再B....,這一個只會在一定程度上起作用(一人一次)。

(3).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
//設置禮讓線程
Thread.yield();
}
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
MyThread mt2 =new MyThread();
mt.setName("大豬");
mt1.setName("小豬");
mt2.setName("胖豬");

mt.start();
mt1.start();
mt2.start();
}
}


5.後臺線程

(1).後臺線程方法
public static void setDaemon(boolean on):將該線程標記為守護線程或者是用戶組線程,當正在運行的線程都是守護線程時,java虛擬機退出
註意:該方法必須在啟動線程前調用。

(2).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
for (int i = 0; i < 1000; i++) {
System.out.println(getName()+"---"+i);
}
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
//其他線程執行內容
MyThread mt =new MyThread();
MyThread mt1 =new MyThread();
mt.setName("關羽");
mt1.setName("張飛");
//標記為守護線程(守護主線程)
mt.setDaemon(true);
mt1.setDaemon(true);

mt.start();
mt1.start();

//主線程執行內容
Thread.currentThread().setName("劉備");
for(int i=0;i<5;i++){
System.out.println(Thread.currentThread().getName()+"----"+i);
}
}
}
//守護主線程,在for()循環執行到4的時候,別的倆個線程就會停止


6.線程控制之中斷線程

(1).中斷線程
public final void stop():結束一個線程(過時,但是仍然可以使用),具有不安全性,直接就退出,不會執行後續代碼。
public void interrupt();結束一個線程,通過拋出異常的方式繼續往下執行後續代碼。


(2).代碼實現
//線程類
public class MyThread extends Thread{
@Override
public void run() {
//super.run();
System.out.println("開始"+new Date());
//休息10秒
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("休息10秒鐘");
}

System.out.println("結束"+new Date());
}
}
//測試類
public class ThreadTest {
public static void main(String[] args) {
//其他線程執行內容
MyThread mt =new MyThread();
mt.setName("三胖");
mt.start();
//超過三秒不執行代碼,那麽就把這一個線程結束
try {
Thread.sleep(3000);
//mt.stop();
mt.interrupt();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//使用stop()方法,輸出結果:
開始Sat Sep 01 00:04:27 CST 2018
//使用interrupt()方法,輸出結果
開始Sat Sep 01 00:04:27 CST 2018
休息10秒鐘
結束Sat Sep 01 00:04:30 CST 2018



7.線程的生命周期

技術分享圖片

Java基礎_多線程2[線程控制]