电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java util concurrent及基本線程原理簡介

瀏覽:8日期:2022-09-02 17:11:33

一:什么是JUC

JUC就是java.util.concurrent下面的類包,專門用于多線程的開發。

二:進程和線程的區別

進程是可并發執行的程序在某個數據集合上的一次計算活動,也是操作系統進行資源分配和調度的基本單位。

線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位.線程自己基本上不擁有系統資源,只擁有一點在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與 同屬一個進程的其他的線程共享進程所擁有的全部資源。

并發:多線程、 多個線程操作一個資源類,快速交替過程。

并行:多核多CPU;

線程的狀態:(java底層源碼)

public enum State { NEW, // 新建線程 RUNNABLE, // 線程運行 BLOCKED, // 線程阻塞 WAITING, // 等待 TIMED_WAITING, // 延時等待 TERMINATED; // 線程銷毀}

三:wait和sleep的區別

1:類層面

wait ------object

sleep-------Thread 誰調用誰睡覺

2:是否釋放鎖層面

wait --------釋放鎖

sleep--------不釋放鎖

3:使用范圍層面

wait,notify,notifyall只能在同步方法中或者同步代碼塊中使用

sleep可以再任意的地方使用

4:異常

sleep必須捕獲異常

wait不需要捕獲異常

四:線程的幾種使用方式

1.優先級

public final void setPriority(int newPriority)

更改線程的優先級。

默認為5,最小為1,最大為10

設置了優先級別之后,級別高 并不是說你一定被優先調度,而是你的被優先調度的概率高而已。

public class Test { public static void main(String[] args) { Tuzi tz=new Tuzi('兔子'); tz.setPriority(2); tz.start();Wugui wg=new Wugui('烏龜'); wg.setPriority(8); wg.start(); }}public class Wugui extends Thread { @Override public void run() { for (int i = 1; i <=100; i++) { System.out.println('我是烏龜我在跑。。'+'----'+this.getName()+'---'+this.getPriority()); } } public Wugui(String name) { super(name); }}

2.線程強制運行:join()

可以通過join()方法使得一個線程強制運行,線程強制運行期間,其他線程無法運行,必須等待此線程完成之后,才可以繼續運行。

public final void join() throws InterruptedException

等待該線程終止。

public final void join(long millis)throws InterruptedException

等待該線程終止的時間最長為 millis 毫秒。超時為 0 意味著要一直等下去。

package Thread1;class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<50;i++){ System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 } }};public class demo1{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 實例化Runnable子類對象 Thread t = new Thread(mt,'線程'); // 實例化Thread對象 t.start() ; // 啟動線程 for(int i=0;i<50;i++){ if(i>10){try{ t.join() ; // 線程強制運行}catch(InterruptedException e){} } System.out.println('Main線程運行 --> ' + i) ; } }};

3 線程的休眠(sleep)

在線程中允許一個線程進行暫時的休眠,直接使用Thread.sleep()方法即可。

sleep定義格式:

public static void sleep(long milis,int nanos)throws InterruptedException

首先,static,說明可以由Thread類名稱調用,其次throws表示如果有異常要在調用此方法處處理異常。

所以sleep()方法要有InterruptedException 異常處理,而且sleep()調用方法通常為Thread.sleep(500) ;形式。

控制當前線程休眠若干毫秒

* 1秒= 1000毫秒

* 1秒 = 1000 * 1000 * 1000納秒 1000000000

package Thread1;class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<50;i++){ try{ Thread.sleep(500) ; // 線程休眠 }catch(InterruptedException e){} System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 } }};public class demo1{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 實例化Runnable子類對象 Thread t = new Thread(mt,'線程'); // 實例化Thread對象 t.start() ; // 啟動線程 }};

4.線程的禮讓(yield)

yield()方法實現線程的禮讓。

package Thread1;class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<5;i++){ try{Thread.sleep(500) ;//休眠一下 }catch(Exception e){} System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 if(i==2){System.out.print('線程禮讓:') ;Thread.currentThread().yield() ; // 首先獲取當前線程,然后線程禮讓 } } }};public class demo1{ public static void main(String args[]){ MyThread my = new MyThread() ; // 實例化MyThread對象 Thread t1 = new Thread(my,'線程A') ; Thread t2 = new Thread(my,'線程B') ; t1.start() ; t2.start() ; }};

5.判斷線程是否在執行:isAlive

class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<3;i++){ System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 } }};public class ThreadAliveDemo{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 實例化Runnable子類對象 Thread t = new Thread(mt,'線程'); // 實例化Thread對象 System.out.println('線程開始執行之前 --> ' + t.isAlive()) ; // 判斷是否啟動 t.start() ; // 啟動線程 System.out.println('線程開始執行之后 --> ' + t.isAlive()) ; // 判斷是否啟動 for(int i=0;i<3;i++){ System.out.println(' main運行 --> ' + i) ; } // 以下的輸出結果不確定 System.out.println('代碼執行之后 --> ' + t.isAlive()) ; // 判斷是否啟動 }};

6.當前線程:CurrentThread()

程序可以通過currentThread()方法取得當前正在運行的線程對象,

class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<3;i++){ System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 } }};public class CurrentThreadDemo{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 實例化Runnable子類對象 new Thread(mt,'線程').start() ; // 啟動線程 mt.run() ; // 直接調用run()方法 }};

7.線程名稱

1,在Thread類中可以通過getName()方法取得線程名稱,通過setName()設置線程名稱。

2,線程的名稱一般在啟動線程前設置,但也允許為運行的線程設置名稱,允許兩個Thread對象有相同名稱,但是應該避免。

3,如果程序沒有為線程指定名稱,系統會自動為線程設置名稱。

class MyThread implements Runnable{ // 實現Runnable接口 public void run(){ // 覆寫run()方法 for(int i=0;i<3;i++){ System.out.println(Thread.currentThread().getName() + '運行,i = ' + i) ; // 取得當前線程的名字 } }};public class ThreadNameDemo{ public static void main(String args[]){ MyThread mt = new MyThread() ; // 實例化Runnable子類對象 new Thread(mt).start() ; // 系統自動設置線程名稱 new Thread(mt,'線程-A').start() ; // 手工設置線程名稱 new Thread(mt,'線程-B').start() ; // 手工設置線程名稱 new Thread(mt).start() ; // 系統自動設置線程名稱 new Thread(mt).start() ; // 系統自動設置線程名稱 }};

五:幾種方法的比較

Thread.sleep(long millis),一定是當前線程調用此方法,當前線程進入阻塞,但不釋放對象鎖,millis后線程自動蘇醒進入可運行狀態。作用:給其它線程執行機會的最佳方式。 Thread.yield(),一定是當前線程調用此方法,當前線程放棄獲取的cpu時間片,由運行狀態變會可運行狀態,讓OS再次選擇線程。作用:讓相同優先級的線程輪流執行,但并不保證一定會輪流執行。實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調度程序再次選中。Thread.yield()不會導致阻塞。 t.join()/t.join(long millis),當前線程里調用其它線程1的join方法,當前線程阻塞,但不釋放對象鎖,直到線程1執行完畢或者millis時間到,當前線程進入可運行狀態。 obj.wait(),當前線程調用對象的wait()方法,當前線程釋放對象鎖,進入等待隊列。依靠notify()/notifyAll()喚醒或者wait(long timeout)timeout時間到自動喚醒。 obj.notify()喚醒在此對象監視器上等待的單個線程,選擇是任意性的。notifyAll()喚醒在此對象監視器上等待的所有線程。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
主站蜘蛛池模板: 斗式提升机,斗式提升机厂家-淄博宏建机械有限公司 | 深圳装修_店面装修设计_餐厅设计_装修全包价格-尚泰装饰设计 | 电缆故障测试仪_电缆故障定位仪_探测仪_检测仪器_陕西意联电气厂家 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 压力喷雾干燥机,喷雾干燥设备,柱塞隔膜泵-无锡市闻华干燥设备有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 防爆暖风机_防爆电暖器_防爆电暖风机_防爆电热油汀_南阳市中通智能科技集团有限公司 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 盐城网络公司_盐城网站优化_盐城网站建设_盐城市启晨网络科技有限公司 | 飞歌臭氧发生器厂家_水处理臭氧发生器_十大臭氧消毒机品牌 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 冷凝水循环试验箱-冷凝水试验箱-可编程高低温试验箱厂家-上海巨为(www.juweigroup.com) | 吉林污水处理公司,长春工业污水处理设备,净水设备-长春易洁环保科技有限公司 | 北京网站建设首页,做网站选【优站网】,专注北京网站建设,北京网站推广,天津网站建设,天津网站推广,小程序,手机APP的开发。 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | PVC地板|PVC塑胶地板|PVC地板厂家|地板胶|防静电地板-无锡腾方装饰材料有限公司-咨询热线:4008-798-128 | 定量包装机,颗粒定量包装机,粉剂定量包装机,背封颗粒包装机,定量灌装机-上海铸衡电子科技有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 余姚生活网_余姚论坛_余姚市综合门户网站 | 时代北利离心机,实验室离心机,医用离心机,低速离心机DT5-2,美国SKC采样泵-上海京工实业有限公司 工业电炉,台车式电炉_厂家-淄博申华工业电炉有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 数控专用机床,专用机床,自动线,组合机床,动力头,自动化加工生产线,江苏海鑫机床有限公司 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 昆山新莱洁净应用材料股份有限公司-卫生级蝶阀,无菌取样阀,不锈钢隔膜阀,换向阀,离心泵 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | 液压压力机,液压折弯机,液压剪板机,模锻液压机-鲁南新力机床有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 自动售货机_无人售货机_专业的自动售货机运营商_免费投放售货机-广州富宏主官网 | 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 聚合氯化铝_喷雾聚氯化铝_聚合氯化铝铁厂家_郑州亿升化工有限公司 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 生产自动包装秤_颗粒包装秤_肥料包装秤等包装机械-郑州鑫晟重工科技有限公司 | 齿轮减速机电机一体机_齿轮减速箱加电机一体化-德国BOSERL蜗轮蜗杆减速机电机生产厂家 | 组织研磨机-高通量组织研磨仪-实验室多样品组织研磨机-东方天净 传递窗_超净|洁净工作台_高效过滤器-传递窗厂家广州梓净公司 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 北京百度网站优化|北京网站建设公司-百谷网络科技 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 申江储气罐厂家,储气罐批发价格,储气罐规格-上海申江压力容器有限公司(厂) | 全自动包装机_灌装机生产厂家-迈驰包装设备有限公司 |