第七章

多线程

模拟车站售票
package com.share.test_3_31;public class CheZhan {public int num = 100;public int id = 1;/*** synchronized* 1、修饰方法,比如mai-----mai方法同一时间仅能有一个线程使用这个方法。* 其他线程如果想使用,在方法外等待当前线程使用完毕* * synchronized(Object){* }//锁住特定对象----仅允许特定对象访问方法块* 注:不要在run方法中使用锁synchronized*/public synchronized void mai(){if (num>0) {System.out.println(Thread.currentThread().getName()+"卖了一张车票,车票id:"+(id++)+"还剩"+(--num)+"张车票");}else{System.out.println("车票已售完,停止售票");MyThread.bool = false;}System.out.println("欢迎下次光临");}public  void mai2(){//多个线程能同时调用这个方法//其它线程在此等待synchronized(this){//仅当前线程能访问if (num>0) {System.out.println(Thread.currentThread().getName()+"卖了一张车票,车票id:"+(id++)+"还剩"+(--num)+"张车票");}else{System.out.println("车票已售完,停止售票");MyThread.bool = false;}}System.out.println("欢迎下次光临");}
}
package com.share.test_3_31;public class Main {public static void main(String[] args) {CheZhan cz = new CheZhan();MyThread t1 = new MyThread("1号窗口",cz);MyThread t2 = new MyThread("2号窗口",cz);MyThread t3 = new MyThread("3号窗口",cz);MyThread t4 = new MyThread("4号窗口",cz);t1.start();t2.start();t3.start();t4.start();}
}
package com.share.test_3_31;public class MyThread extends Thread {public CheZhan cz;public static boolean bool = true;public MyThread(String name,CheZhan cz){super(name);this.cz = cz;}@Overridepublic void run() {while(bool){cz.mai();}}
}
package com.share.test_3_31;public class Game {public Object key1;public Object key2;public Game(){key1 = new Object();key2 = new Object();}public void start(int n){if (n >0 ) {synchronized(key1){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("通道1:---------继续游戏");synchronized(key2){System.out.println(Thread.currentThread().getName()+"逃脱成功");}}} else{synchronized(key2){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("通道2:---------继续游戏");synchronized(key1){System.out.println(Thread.currentThread().getName()+"逃脱成功");}}}}
}
package com.share.test_3_31;public class GameMain {class User extends Thread{public Game g;public int n;User(String name, Game g,int n){super(name);this.g = g;this.n = n;}@Overridepublic void run() {g.start(n);}}public static void main(String[] args) {Game g = new Game();User u1 = new GameMain().new User("sb",g,1);User u2 = new GameMain().new User("sb1",g,-1);u1.start();u2.start();}
}
package com.share.test_3_31;import java.util.Random;public class Test {/** 中午打饭: 1、食堂----将饭菜打包【生产爱心便当】、取出爱心便当 2、最多存放三个爱心便当 3、有三个爱心人士做爱心便当 4、有6个人取便当*/public static void main(String[] args) {Test t = new Test();Mess mess = t.new Mess();People people1 = t.new People("1号工作人员",mess);People people2 = t.new People("2号工作人员",mess);People people3 = t.new People("3号工作人员",mess);Student s1 = t.new Student(mess,"汪洪毅");Student s2 = t.new Student(mess,"滕彩俊");Student s3 = t.new Student(mess,"林杰");Student s4 = t.new Student(mess,"谭小雨");Student s5 = t.new Student(mess,"肖峰");Student s6 = t.new Student(mess,"徐周");people1.start();people2.start();people3.start();s1.start();s2.start();s3.start();s4.start();s5.start();s6.start();//java程序里最多能同时跑多少个线程}/*** 爱心午餐*/public class Lunch {String food[] = { "凉拌豆腐干", "烧黄豆", "回锅肉", "麻婆豆腐", "清炒白菜" };String first;// 第一个菜String second;// 第二个菜String third;// 第三个菜public Lunch() {// 初始化属性first = food[new Random().nextInt(food.length)];second = food[new Random().nextInt(food.length)];third = food[new Random().nextInt(food.length)];}public String toString() {return "【" + first + "+" + second + "+" + third + "】";}}/*** 食堂*/public class Mess {Lunch box[] = new Lunch[3];int index = 0;public synchronized void put(Lunch wucan) {// 将制作好的爱心便当放到指定位置while (index == box.length) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notify();box[index] = wucan;index++;}public synchronized Lunch get() {while (index == 0) {try {this.wait();} catch (InterruptedException e) {e.printStackTrace();}}this.notify();index--;return box[index];}// 从指定位置取爱心便当}/*** 食堂的工作人员 负责生产爱心便当*/public class People extends Thread{public Mess mess = null;public People(String name,Mess mess){super(name);this.mess = mess;}@Overridepublic void run() {while(true){Lunch lunch = new Lunch();mess.put(lunch);System.out.println(Thread.currentThread().getName()+"制作了爱心便当:"+lunch);try {sleep(new Random().nextInt(1000));} catch (InterruptedException e) {e.printStackTrace();}}}}/*** 消费者*/public class Student extends Thread{public Mess mess = null;public Student(Mess mess,String name){super(name);this.mess = mess;}@Overridepublic void run() {Lunch lunch = mess.get();System.out.println(Thread.currentThread().getName()+"拿了一份爱心便当"+lunch);}}
}
package com.share.test_3_31;public class Test1 {/*** 中午打饭:* 1、食堂---将饭菜打包【生产爱心便当】、取出爱心便当* 2、最多存放三个爱心便当* 3、有三个爱心人士最爱心便当* 4、有6个人排序取便当*/public static void main(String[] args) {ShiTang st = new ShiTang();PersonFan pf = new PersonFan(st);PersonEat pe = new PersonEat(st);Thread t1 = new Thread(pe);Thread t2 = new Thread(pf);Thread t3 = new Thread(pf);Thread t4 = new Thread(pf);t1.start();t2.start();t3.start();t4.start();}
}
//饭菜类
class FanCai{int id;FanCai(int id){this.id = id;}public String toString(){return "饭菜"+id;}
}
//食堂
class ShiTang{FanCai[] arrFC = new FanCai[2];int index = 0;public synchronized void push(FanCai fc){//做便当System.out.println(index);while(index == 2){try {this.wait();System.out.println("饭菜已经做好");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}this.notifyAll();arrFC[index] = fc;index++;   }public synchronized FanCai pop(){//取饭菜while(index == 0){try {this.wait();//System.out.println("吃饭了。。。");} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}this.notifyAll();index --;return arrFC[index];}
}
//打饭的人
class PersonFan implements Runnable{ShiTang st = null;PersonFan(ShiTang st){this.st = st;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {FanCai fc = new FanCai(i);st.push(fc);System.out.println("生产了饭菜"+fc);try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
//吃饭的人
class PersonEat implements Runnable{ShiTang st = null;PersonEat(ShiTang st){this.st = st;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {FanCai fc = st.pop();System.out.println("吃了饭菜"+fc);try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
package com.share.test_3_31;import java.util.Random;public class ZuoYe3 {/*** 模拟考试。。。。考试时间60秒* 有4个考生,试卷有30道题,考生的做题速度随机1-4秒做一道题* 考试开始时,考生开始做题,考试时间到之后收卷,所有考生不能再答题* 输出每一个考生的答题情况,列如:考生1:在规定时间完成了15题,完成度:50%* */public static int time = 100;//时间轴public static boolean bool = true;//允许答题public class Student extends Thread{public Student(String name){super(name);}@Overridepublic void run() {int n = 0;while (n<30 && bool) {n++;try {Thread.sleep((new Random().nextInt(4)+1)*time);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if (!bool) {System.out.println("时间到,"+Thread.currentThread().getName()+"完成了"+n+"道题,完成度:"+n*100/30.0+"%");}else{System.out.println(Thread.currentThread().getName()+"提前完成了考试");}}}public static void main(String[] args) {Student s1 = new ZuoYe3().new Student("1号考生");Student s2 = new ZuoYe3().new Student("2号考生");Student s3 = new ZuoYe3().new Student("3号考生");Student s4 = new ZuoYe3().new Student("4号考生");System.out.println("考试开始:");s1.start();s2.start();s3.start();s4.start();try {Thread.sleep(60*time);//考试时间60秒。主线程休眠,控制bool的值确保考试时间为60秒} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}bool=false;}}

【Java学习0331】多线程相关推荐

  1. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

  2. Java学习笔记---多线程并发

    Java学习笔记---多线程并发 (一)认识线程和进程 (二)java中实现多线程的三种手段 [1]在java中实现多线程操作有三种手段: [2]为什么更推荐使用Runnable接口? [3][补充知 ...

  3. Java 学习 Day17 多线程

    Java 学习 Day17 文章目录 Java 学习 Day17 一.基本概念:程序.进程.线程 二.线程的创建和使用 三.多线程的创建,方式一:继承于Thread类 四. 创建多线程的方式二:实现R ...

  4. java学习(多线程)

    1.线程概念 进程则是执行程序的一次执行过程,他是一个动态的概念.是系统资源分配的单位 通常在一个进程中可以包含若干个线程,当然一个进程中至少有一个线程,不然没有存在的意义 核心概念 对同一份资源操作 ...

  5. java学习笔记 多线程(一)创建多线程,线程常用方法

    首先是进程和线程的区别,进程就是像打开csgo.exe就是一个进程,然后打开LOL.exe又是另外一个进程了. 而线程呢,就是在同一进程内部,发生的事情. 那么就开始了解线程! 创建多线程: 线程有三 ...

  6. 【Java学习】多线程2

    Java多线程的安全问题: 由于多线程的代码块中可能有共享资源,因此,当一个线程刚好使用共享资源时,CPU让改线程被吊起,转而执行另外一个线程时,第二个线程又去使用共享资源,从而出现共享资源不一致的状 ...

  7. java学习(六)多线程 上

    进程:进程是一个正在执行的程序,这个程序呢都有一个执行顺序,这个执行顺序是一个执行路径,或者说是一个控制单元. 所有的进程不会同时发生,而是来回切换. 线程:打个比方,一堆货物,一个人搬花十个小时,十 ...

  8. Java学习笔记 --- 多线程

    一.线程相关概念 程序 程序是为完成特定任务,用某种语言编写的一组指令的集合.简单的说就是我们写的代码 进程 1.进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存 ...

  9. Java学习笔记---多线程同步的五种方法

    一.引言 前几天面试,被大师虐残了,好多基础知识必须得重新拿起来啊.闲话不多说,进入正题. 二.为什么要线程同步 因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会 ...

最新文章

  1. 白话spring依赖注入
  2. 填问卷赢280元SaaS峰会门票 与Salesforce、Zenefits现场交流!
  3. php对象的底层机制
  4. 关系运算符、逻辑 运算符与三元运算符
  5. 前端面试每日 3+1 —— 第32天
  6. 折线图设置圆点_Seaborn可视化 折线图seaborn.lineplot
  7. 大数据_Flink_Java版_数据处理_流处理API_Transform(3)_Reduce聚合算子---Flink工作笔记0031
  8. MyStringTokenize
  9. 模拟电子技术的一点心得(转)
  10. 软件测试(白盒测试入门之gtest测试)
  11. 不想做成年人?看到第一张就哭了,满满的回忆
  12. 【优化求解】基于收敛因子和黄金正弦指引机制的蝴蝶优化算法求解单目标优化问题matlab代码(AGSABOA)
  13. 组会 | RELAXLOSS: DEFENDING MEMBERSHIP INFERENCE ATTACKS WITHOUT LOSING UTILITY
  14. Pycharm 一键加引号,快速加引号,批量加引号
  15. Vue前端自动化测试-Vue Test Utils
  16. 复选框全部选中/全部取消
  17. virustotal采集案例
  18. go iris 源码思路分析
  19. 数字IC-1.8 子模块组建整模块-动态数码管设计代码实例
  20. 学计算机显卡,计算机显卡与显示器

热门文章

  1. 双系统安装(windows和linux)
  2. Android zxing扫描本地二维码图片NotFoundException
  3. Pocket Gimbal隐私政策
  4. 红安一中2021高考成绩查询,红安一中高考金榜 红安新一中规划
  5. EN 1096-4涂层玻璃建筑材料英国UKCA认证—EN 1096-4
  6. ORA-12012: error on auto execute of job “SYS“.“ORA$AT_OS_OPT_SY_12062“ ORA-20001: Statistics Advisor
  7. html未知错误,未知错误是什么意思
  8. 量化投资 第27章 K线图 27.3.1
  9. linux 系统时间编程(1) wall time和monotonic time科普
  10. 台式计算机电源风扇不转,台式电脑风扇不转了怎么解决?台式电脑风扇不转的原因?...