范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

多线程技术(同步异步,并发并行)守护线程(java垃圾回收机制)

  多线程技术概述
  每个线程都有自己的栈空间,并用一份堆内存 1.同步和异步
  同步:排队执行,效率低但是安全.
  异步:同时执行,效率高但是数据不安全. 2.并发与并行
  并发:指两个或多个时间在同一个时间段内发生.
  并行:指两个或多个时间在同一时刻发生(同时发生) 3.执行步骤,有利于理解线程时用来做什么的 public class Test {     public static void main(String[] args) throws InterruptedException {         //1.创建一个任务对象         Xiancheng x1 = new Xiancheng();         //2.创建一个线程,并为其分配一个任务         Thread t = new Thread(x1);         //3.执行这个线程         t.start();      } } 4.多用Runnable
  5.线程对象可以打标记package com.kkb;  public class Demo01_ThreadInterrupt {     public static void main(String[] args) {          Thread t = new Thread(new MyThings());         t.start();         for (int i = 0; i < 5; i++) {             System.out.println(Thread.currentThread().getName()+i);             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }         }         t.interrupt();//给线程添加标记       } } class MyThings implements Runnable{      @Override     public void run() {         for (int i = 0; i < 10; i++) {             System.out.println(Thread.currentThread().getName()+i);             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {//中断异常-->>如果这个事物正在执行的线程有了中断标记,那么就进入到catch块中                 //System.out.println("虽然我添加了标记来到了这里,但是,你没有让我死亡哈哈哈哈");                 //加上return资源就释放了                 System.out.println("添加了interrupt标记,后面返回return,我结束了");                 return;             }         }     } } 6.守护线程
  线程:分为守护线程和用户线程
  用户线程:当一个进程不包含任何的存货线程时,进程结束
  守护线程:守护用户的线程,当最后一个用户线程结束时,所有守护线程自动死亡 package com.kkb;  public class Demo01_ThreadInterrupt {     public static void main(String[] args) {          Thread t = new Thread(new MyThings());         t.setDaemon(true);//设置t为守护线程,当这个应用(进程中最后一个用户线程死亡的时候,守护线程自动死亡)         t.start();         for (int i = 0; i < 5; i++) {             System.out.println(Thread.currentThread().getName()+i);             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {                 e.printStackTrace();             }         } //        t.interrupt();//给线程添加标记       } } class MyThings implements Runnable{      @Override     public void run() {         for (int i = 0; i < 10; i++) {             System.out.println(Thread.currentThread().getName()+i);             try {                 Thread.sleep(1000);             } catch (InterruptedException e) {//中断异常-->>如果这个事物正在执行的线程有了中断标记,那么就进入到catch块中                 //System.out.println("虽然我添加了标记来到了这里,但是,你没有让我死亡哈哈哈哈");                 //加上return资源就释放了                 System.out.println("添加了interrupt标记,后面返回return,我结束了");                 return;             }         }     } } 7.线程安全问题
  概述:  * 为什么会导致线程不安全:  * 首先假定一种情况:当事物中余票为1时,三个线程进入来买票  * 1.A线程:看到conut>0,进入,正在出票的时候,count还没来得及做数据的变更操作  * 2.B线程:这个时候,B也进来了,因为conut还没有变更  * .....  * 这就是多线程,进入产生时间偏的问题-->>这里为了更好的模拟实际中的放票状态,就引入了一个Thread.sleep,使线程进行休眠的操作package com.kkb;  /**  * 为什么会导致线程不安全:  * 首先假定一种情况:当事物中余票为1时,三个线程进入来买票  * 1.A线程:看到conut>0,进入,正在出票的时候,count还没来得及做数据的变更操作  * 2.B线程:这个时候,B也进来了,因为conut还没有变更  * .....  * 这就是多线程,进入产生时间偏的问题-->>这里为了更好的模拟实际中的放票状态,就引入了一个Thread.sleep,使线程进行休眠的操作  *   */ public class UnSafe {     public static void main(String[] args) {         Runnable r = new Ticket();         Thread t1 = new Thread(r);         Thread t2 = new Thread(r);         Thread t3 = new Thread(r);         t1.start();         t2.start();         t3.start();     }     static class Ticket implements Runnable{         private int conut = 10;          @Override         public void run() {             while (conut > 0){                 System.out.println("正在准备卖票");                 try {                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 conut--;                 System.out.println("余票:"+conut);             }         }     } } 8.synchronized锁
  注意:看同一把锁!!!!
  同步代码块和同步方法都是隐式锁 1.同步代码块package com.kkb;  /**  *  所谓上锁:就是在一个线程正在执行任务时,其他的对象只能在外面排队,因为这个事物现在的情况对外是不开放的  *  指定事物中的一个锁对象,在一个线程进入时,这个对象就会被标记上一把锁  *  要看同一把锁  */ public class Safe_Synchronized {     public static void main(String[] args) {         Runnable r = new Ticket();         Thread t1 = new Thread(r);         Thread t2 = new Thread(r);         Thread t3 = new Thread(r);         t1.start();         t2.start();         t3.start();     }     static class Ticket implements Runnable{         private int conut = 10;         private Object o = new Object();         //注意这里的o为了保证这个事物中存在一个可以上锁的对象         @Override         public void run() {             while (true) {                 synchronized (o) {                     if (conut > 0) {                         System.out.println(Thread.currentThread().getName() + "正在准备卖票");                         try {                             Thread.sleep(1000);                         } catch (InterruptedException e) {                             e.printStackTrace();                         }                         conut--;                         System.out.println("余票:" + conut);                     }else {                         break;                     }                 }             }         }     } } 2.设计为同步方法 *  注意这里面锁方法的时候,锁的对象就是这个方法饿地址上加锁,一个一个进入此方法  *  我们打印出来的this就是:com.kkb.Safe_Synchronized_To_method$Ticket@3694916f  *  这个方法的地址  只需要在这个方法上加上synchronized进行标志package com.kkb;  /**  *  注意这里面锁方法的时候,锁的对象就是这个方法饿地址上加锁,一个一个进入此方法  *  我们打印出来的this就是:com.kkb.Safe_Synchronized_To_method$Ticket@3694916f  *  这个方法的地址  */ public class Safe_Synchronized_To_method {     public static void main(String[] args) {         Runnable r = new Ticket();         Thread t1 = new Thread(r);         Thread t2 = new Thread(r);         Thread t3 = new Thread(r);         t1.start();         t2.start();         t3.start();     }     static class Ticket implements Runnable{         private int conut = 10; //        private Object o = new Object();         //不需要这个对象了         //因为锁方法的时候锁的其实就是this,这个save方法的this         //注意这里的o为了保证这个事物中存在一个可以上锁的对象         //com.kkb.Safe_Synchronized_To_method$Ticket@3694916f         @Override         public void run() {             while (true) {                 boolean sale = sale();                 if (!sale){//如果没票了就结束                     break;                 }              }         }         public synchronized boolean sale(){             if (conut > 0) {                 System.out.println(Thread.currentThread().getName() + "正在准备卖票");                 try {                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 conut--;                 System.out.println("余票:" + conut);                 System.out.println(this);             }else {                 return false;             }              return true;         }     } } 3.显示锁Lock l = new ReentrantLock();package com.kkb;  import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock;  /**  *  */ public class Safe_Synchronized_Lock {     public static void main(String[] args) {         Runnable r = new Ticket();         Thread t1 = new Thread(r);         Thread t2 = new Thread(r);         Thread t3 = new Thread(r);         t1.start();         t2.start();         t3.start();     }     static class Ticket implements Runnable{         private int conut = 10;         //给一把显式锁         private Lock l = new ReentrantLock();//Lock锁接口的实现类         @Override         public void run() {             while (true) {                 //每次一个线程进入就会加上一个锁,其他线程无法进入                 l.lock();//加锁                 boolean sale = sale();                 l.unlock();//解锁                 if (!sale){//如果没票了就结束                     break;                 }              }         }         public boolean sale(){             if (conut > 0) {                 System.out.println(Thread.currentThread().getName() + "正在准备卖票");                 try {                     Thread.sleep(1000);                 } catch (InterruptedException e) {                     e.printStackTrace();                 }                 conut--;                 System.out.println("余票:" + conut);             }else {                 return false;             }              return true;         }     } } 4.公平锁和不公平锁
  就是在声明显式锁的时候加上一个true.
  排队一个一个进,不会出现线程争先恐后的,谁抢到就是谁的 Lock l = new ReentrantLock(true);Thread-0正在准备卖票 余票:9 Thread-1正在准备卖票 余票:8 Thread-2正在准备卖票 余票:7 Thread-0正在准备卖票 余票:6 Thread-1正在准备卖票 余票:5 Thread-2正在准备卖票 余票:4 Thread-0正在准备卖票 余票:3 Thread-1正在准备卖票 余票:2 Thread-2正在准备卖票 余票:1 Thread-0正在准备卖票 余票:0 9.多线程交互问题
  线程的wait和线程的唤醒notifyAll
  再引入一个变量交替执行 10.线程池
  如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁的船舰线程和销毁线程需要时间.线程池就是一个可以容纳多个线程的容器,池中的线程可以反复的使用,省区了频繁创建线程对象的操作,节省了大量的时间和资源.
  1.创建线程
  2.创建任务
  3.执行任务
  4.关闭线程
  1.缓存线程池
  2.定长线程池
  3.单线程池
  4.周期定长线程池

王者荣耀到底什么段位才算是高端局?现如今的王者荣耀被某些人整的乌烟瘴气到现在都不知道真正所谓的高端局到底是什么局?钻石打赢,高端。打输,低端星耀打赢,高端。打输,低端王者几星排位?星星太低,不配和我打打个线到底什么LOL送死流塞恩重新爆火他真的有这么强吗?送死流塞恩目前很火,小编基本上天天去大司马直播间看他玩害虫,基本上弹幕效果爆炸,节目拉满。这个流派有意思吗?回答是意思,因为这个玩法让玩家感受到了另一种英雄联盟的玩法,让一些喜欢玩原神的3个冷知识NPC会鼓掌锅巴是魔神璃月在悄然转型原神里有很多有趣的冷知识,比如提瓦特没有马璃月没有鸡稻妻的狐狸无法攻击等等。今天怪力瓦舍整理里一些有趣的冷知识,不妨一起来看看吧。释放技能NPC会鼓掌玩家释放技能时,NPC会鼓掌,eStarPro41战胜TTG,论如何打出超强压制力1线权优势队伍所选英雄是否具备线权优势直接影响了队伍前期的攻防能力,如eStarPro唯一输掉的对局中,便是由于同时拿了不知火舞伽罗孙膑,不知火舞对线西施无线权优势,伽罗对线公孙离三国杀新武将刘璋一上线就出bug?就这还敢卖四十宝珠?哈喽,大家好,我是阿柴。几日不见,阿柴我啊,真是想死大伙啦!又到了年底,三国杀移动版也开始陆续开放一个个大活动这一周就是很多人期待很久的双倍充值。听柴子一句话,不充最快乐!话不多说魔兽争霸3,有控制防御力超高的小强,为何登场率一直低迷?玩过魔兽争霸3的朋友们都知道,在游戏中,UD的首发英雄一般都以DK为主,有了它整个部队才有源源不断的恢复能力。至于二发英雄肯定是非巫妖莫属了,一手NC连击即可打得对手痛不欲生。对于大话西游2通关仅20分钟,塔四能秒180万的仙还需要魔吗?大家好,欢迎来到今天的大话西游2故事汇。大话西游2作为一款成功运营将近二十年的经典网络游戏,土豪大佬玩的游戏仿佛和普通玩家是两个世界。单说杀塔等日常任务,就算其他都是一回合,加上跑令人又爱又恨的光环无限战役做完了,但没完全做完文haKuRyu如果从未接触过光环系列的萌新误以为这就是光环的正常水准,那可真是悲哀啊。感谢没有人的邀请,我得以花费30小时的时间通关光环无限并收集游戏中的大部分支线要素,写下身为金铲铲之战S6两个三星5费英雄没打赢科加斯,玩家郁闷不已在金铲铲之战S6双城传说版本中,5费英雄升三星的难度特别大。要么金币非常多,又有升级咯海克斯强化,升到十人口要么玩赏金连败,有多个妮蔻之助,否则,一般情况下很难出现三星五费。也正因原神芭莎夜雨甘雨的打狗小帮手作者NGA斯凯澜影舞向各位无法满星的手残朋友推荐这个阵容芭莎夜(叶)雨(感谢8L大佬赐名)芭aka芭芭拉莎aka修女夜aka万叶雨aka甘雨我用这个阵容走上胡行钟走下,满星还能富余继Uzi复出后,Pawn也已宣布复出,速请无天?天下本是将军定,铁腰佛祖下凡间速请无天GODVPawn,最开始在LCK的三星白一战成名,击败皇族拿得S4总冠军,那时候的三星白强的离谱,离谱到后面每一届S赛冠军都会被拿去和S4的三
八十万人齐催更,比电影更精彩的生存类新游来袭末日丧尸题材作为影视业的流量密码,可谓是爆品频出。如2016年火爆亚洲的电影釜山行,豆瓣评分人数超百万,均分仍有8。6分,长盛不衰的生化危机系列,用末日讲述孤独的电影我是传奇等等,王者赛季六号更新!新赛季装备大改提前知一月六号王者即将迎来一次赛季更新,这次更新的内容比较多,对玩家影响最大的就是装备了。小编今天给大家带来了新版本装备改动。新装备破茧之衣160法术攻击四1000最大生命被动法力折射7虎娘日报新英雄Zeri原画曝光春节红包表情预览LOL新鲜事,简单报,虎娘带你来回顾一下今天在撸圈都有哪些有热点新闻发生吧12。1版本更新改动预览,船长皎月将获得加强近日,设计师公布了关于12。1版本的具体改动方向。本次改动在拳炉石传说开年就有大瓜?黄金赛狂野组冠军顺延,原定解说涉嫌代打炉石传说黄金公开赛苏州站落幕了,然而这一届黄金赛却留下了一地的瓜,狂野组因为冠军涉嫌共享账号,并且疑似还在滥用bug的禁赛期,最终冠军顺延给了第二名,而战棋组比赛到一半直接网络崩溃哈利波特手游人均手工大师?魔药瓶颜值太高,还原的一模一样说起哈利波特手游中的魔药,相信玩家们还是非常喜欢的。魔药具有不同的功能,能帮助玩家完成各种任务。比如隐形药水,就能让玩家隐身前往各个学院的公共休息室打卡。甚至还能偷偷潜入校长办公室GTA6来了?舅舅党曝R星今年将公布一款大作最近关于R星新作的传闻真的是很多,比如恶霸鲁尼重制版GTA6荒野大镖客重制版等等,现在又有新的爆料了!自R星游戏的知名爆料人Tez2在论坛爆料表示,2022年几乎是R星宣布下一部作s26赛季改动1。首先是兵线调整,四分钟之后兵线会增加一个弩车取代原来的炮车。炮车刷新时间变为十分钟以后2。然后是主宰跟暴君的调整,主宰跟暴君由四分钟变为三分钟。击杀暴君会获得一个闪电buff,白色月牙才是最适合TES的教练?369走后网友调侃休息室气氛真好一支队伍当中,不但需要有一群强力的选手,有一位优秀的教练也是非常重要的事情。作为队伍当中的主心骨,优秀的教练可以很好的带出一位选手,并且还可以将队伍当中的气氛,调节的特别的好。就像王者荣耀挑战杯抽签戏剧化十足,TES对战XYG?刺痛希望对抗Fly王者荣耀绝对是现在手游市场的一哥,即便英雄联盟手游出来了对于王者荣耀的人气也是望尘莫及的。而王者荣耀KPL总决赛在前不久刚刚落下了帷幕,随之而来的就是王者荣耀挑战者杯选拔赛,总计一LPL训练赛胜率曝光!EDG胜率仅6成,小虎爆料RNG很强还有一周的时间LPL春季赛就要正式开启了,新赛季因为有很多战队都变更了选手阵容,所以成绩到底如何还真的不好说,现阶段只能根据账面实力和训练赛的一些爆料来猜测每队的真实实力,而就在最STEAM年度最佳游戏,生化危机8村庄,实至名归就在刚刚STEAM公布了2021年最佳游戏获奖者生化危机8村庄,这款完全由玩家投票选出的游戏,可谓是实至名归。生化危机8村庄正途才是王道,生化危机是解密游戏从初代生化危机的浣熊市开