java-初識多線程
阿新 • • 發佈:2019-05-06
void package bsp ide 運行 改變 str err over
概要:
一:線程狀態
(1)新生狀態-》創建線程對象然後實現start()方法
(2)就緒狀態
(3)運行狀態-》cpu調度
(4)阻塞狀態
(5)死亡狀態
二:停止線程
1.自然終止:線程體正常運行完畢
2.外部幹涉:
1)線程類中定義線程體的標識
2)線程體使用該標識
3)提供對外的方法改變該標識
4)外部根據條件調用該方法即可
三:阻塞
1.join:合並線程,Y.join(),則先執行Y對象裏面的線程體
2.Thread.yield():暫停線程,當前的方法體
3.Thread.sleep():睡眠,模擬延時,但有可能出現數據異常,資源沖突
四:線程基本信息
isAlive():判斷線程是否活著,是否未終止
getPriority():獲取線程的優先級數據,優先級代表的是概率,並非絕對的先後順序
setPriority():設置線程的優先級
setName():給線程取名字
getName():獲取線程名字
currentThread():獲取當前正在運行的線程對象,也就是取得自己本身
五:線程同步(線程並發)
synchronized->同步
(1)同步塊:
synchronized(引用類型 || this || 類.class){}
(2)同步方法:
synchronized 方法名(){}
多個線程訪問同一份資源,確保資源安全->線程安全
線程安全則效率低,反之
上代碼了解一下:
(簡單利用靜態代理模式)
1.具體角色:
1 packagecom.test; 2 /*使用Runnable創建線程 3 * 1.使用靜態代理模式實現啟動多線程 4 * (1)創建真實角色 5 * (2)創建代理角色 6 */ 7 public class Singer implements Runnable { 8 9 @Override 10 public void run() { 11 System.out.println("歌手線程執行->歌手曹操準備上臺唱歌。。"); 12 } 13 }
2.代理角色:保持對具體角色的引用
1 packagecom.test; 2 3 public class Agent implements Runnable{ 4 Singer singer=new Singer(); 5 Thread t1=new Thread(singer); 6 public Agent(Singer singer) { 7 super(); 8 this.singer = singer; 9 } 10 private void before() { 11 System.out.println("代理員線程執行->代理員已經準備好臺前工作,歌手就緒!"); 12 } 13 private void after() { 14 System.out.println("代理員線程執行->代理員已經收拾完場地,護送歌手離開!"); 15 } 16 17 @Override 18 public void run() { 19 System.out.println("歌手線程未啟動:"+t1.isAlive()); 20 before(); 21 t1.start(); 22 t1.setName("歌手線程"); 23 System.out.println("當前線程為:"+t1.currentThread()); 24 System.out.println("當前線程名稱:"+t1.getName()); 25 System.out.println("歌手線程啟動:"+t1.isAlive()); 26 //這裏存在多線程運行的延時,即代理員的線程可能運行在歌手的線程前面 27 after(); 28 } 29 }
3.場景模擬:
1 package com.test; 2 /* 3 * 場景模擬:實現多線程的啟動 4 */ 5 public class Client { 6 7 public static void main(String[] args) throws InterruptedException { 8 //具體角色 9 Singer singer=new Singer(); 10 //代理角色 11 Agent ag=new Agent(singer); 12 Thread p2=new Thread(ag); 13 //啟動線程 14 p2.start(); 15 } 16 }
效果截圖:
ps:文章僅作學習了解,如有不對之處歡迎大佬指正。
java-初識多線程