一.   两种常用的创建多线程的书写格式

1.继承Thread类实现多线程的格式:
                 权限修饰符        类名   extends    Thread { }
        2.实现Runnable接口实现多线程的格式:
                 权限修饰符        类名   implements Runnable { }

1.通过继承Thread类本身。
        2.通过实现Runnable接口。
        3.通过Callable和Future创建线程池。

Thread类本身也是实现了Runnable接口来达到开启线程的目的。我们平时开发,通过实现Runable接口来实现多线程。(理由:接口相比类更加轻量,较少许多隐形的问题;Java属于单继承语言,尽量把父类这个位置空出来)。

public class TestDemo01 {public static void main(String[] args) {MyThread thread1=new MyThread();MyThread thread2=new MyThread();thread1.start();thread2.start();}
}class MyThread extends Thread{//含义:@Override代表重写父类方法@Overridepublic void run(){System.out.println(" Java 688 ");}
}
public class TestDemo03 extends Thread{private Thread t;private String threadName;public TestDemo03() {}public TestDemo03( String name) {this.threadName = name;System.out.println("构造器声明   "+threadName);}@Overridepublic void run(){System.out.println("运行 "+threadName);try {for (int i = 10; i > 0; i--) {System.out.println("线程名称: " + threadName + ", " + i);//线程睡眠Thread.sleep(1000);}} catch(InterruptedException e) {System.out.println(threadName+"中断");}System.out.println(threadName+"退出");}@Overridepublic void start(){System.out.println(threadName+"开始工作");if (t==null) {t = new Thread(this,threadName);t.start();}}/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubTestDemo03 t1=new TestDemo03("wang-1");t1.start();TestDemo03 t2=new TestDemo03("wang-2");t2.start();}}

二. Java多线程常用的方法

run()方法:主要包含的是线程工作的主要逻辑。
 start()方法:用于实现run()方法中的具体逻辑。调用多少次start(),就是开启多少个线程。

start()方法需要用Thread类或者Thread类的子类来调用。

currentThread():返回对当前正在执行的线程对象的引用。

yield():对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。

join():能让线程进行插队的方法。

wait():线程的等待。

(如果采用的是extends Thread 来实现多线程,那么需要用该类的对象来调用start()方法)

public class TestDemo03 {public static void main(String[] args) {Runnable runnable = new MyRunnable();Thread thread=new Thread(runnable);thread.start();}}
class MyRunnable implements Runnable{@Overridepublic void run() {System.out.println("通过Runnable创建的线程!");}}
public class TestDemo02 implements Runnable {private String threadName;public TestDemo02(String threadName) {this.threadName=threadName;}@Overridepublic void run() {System.out.println(threadName);for(int i=0;i<10;i++) {System.out.println("线程--"+threadName+"--"+i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}System.out.println("线程*"+threadName+"*执行结束");}public static void main(String[] args) {TestDemo02 t1=new TestDemo02("陈晓明");TestDemo02 t2=new TestDemo02("张阳阳");Thread zhangsan=new Thread(t1);Thread lisi=new Thread(t2);zhangsan.start();lisi.start();}
}

三 线程池与池化的思想

(1)new出Thread或者Thread的子类

(2)显示的调用start()创建线程是一个比较复杂并且耗费计算机资源的过程。

池化的优点:

(1)省掉了创建和销毁线程的过程。

(2)通过许多参数来更好的管理线程。

卖票案例一:张三,李四,王五共卖100张票,例子如下:

public class TestDemo05 implements Runnable{//票数 static和synchronizedprivate int ticketNum = 100;@Overridepublic void run() {//获取当前时间long time1=System.currentTimeMillis();//具体的卖票逻辑while(ticketNum > 0) {//currentThread():返回对当前正在执行的线程对象的引用。System.out.println(Thread.currentThread().getName()+ "拿到了第" + ticketNum-- +"票");}long time2=System.currentTimeMillis();System.out.println("本次程序运行时间为: "+ (time2-time1));}public static void main(String[] args) {TestDemo05 t1 = new TestDemo05();TestDemo05 t2 = new TestDemo05();TestDemo05 t3 = new TestDemo05();new Thread(t1,"张三").start();new Thread(t1,"李四").start();new Thread(t1,"王五").start();   }}

卖票案例二:张三,李四,王五每个人都卖100张票,例子如下:

public static void main(String[] args) {TestDemo05 t1 = new TestDemo05();TestDemo05 t2 = new TestDemo05();TestDemo05 t3 = new TestDemo05();new Thread(t1,"张三").start();new Thread(t2,"李四").start();new Thread(t3,"王五").start();
}
public class TestDemo06 implements Runnable{//static 类调用,内存中只有一份。private static int ticketNum=100;@Overridepublic void run() {// TODO Auto-generated method stublong time1=System.currentTimeMillis();while(ticketNum>0) {System.out.println(Thread.currentThread().getName()+" 拿到了第"+ticketNum--+"票");}long time2=System.currentTimeMillis();System.out.println("本次程序运行时间为: "+(time2-time1));}public static void main(String[] args){TestDemo06 t1=new TestDemo06();TestDemo06 t2=new TestDemo06();TestDemo06 t3=new TestDemo06();new Thread(t1,"张三").start();new Thread(t2,"李四").start();new Thread(t3,"王五").start();}
}

注:ticketNum变量前加了static属性,t1,t2,t3三个人共卖100张票。

经典的卖票案例讲解:

a.多个线程卖一个票,还是多个线程卖自己线程的票。两者是有极大区别的。

b.如何去共享销售的票的张数吶? 新建线程的时候,将new Thread(t1,"张三").start()的第一个参数(目标对象)设置为同一个对象即可。

c.如何去销售每个线程自己独有的票数?新建线程的时候,将new Thread(t1,"张三").start();
       new Thread(t2,"李四").start();new Thread(t3,"王五").start();  的第一个参数(目标对象)设置为不同的对象即可。

d.static静态修饰符可以将被它修饰的变量在内存中只有一份。在某些情况下,就能帮助我们减少代码的改动量。

JAVA多线程实现案例相关推荐

  1. Java多线程分析案例

    1. 多线程的创建方式 (1).继承 Thread类:但Thread本质上也是实现了Runnable 接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过 Thread 类的 sta ...

  2. Java多线程经典案例分享

    汇总 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例一 实现一个容器,提供两个方法,add(),count() 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数 ...

  3. 基于Java多线程操作文件案例分享

    场景描述:某文件夹下有很多文件和文件夹,要求读取出该文件夹下的所有文件,并将文本打印输出. 案例分析:假设该文件夹下有10个文件,那么我们将所有的文件遍历一遍打印输出就可以了.但如果有100个, 10 ...

  4. java基础-多线程应用案例展示

    java基础-多线程应用案例展示 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.两只熊,100只蜜蜂,蜜蜂每次生产的蜂蜜量是1,罐子的容量是30,熊在罐子的蜂蜜量达到20的时候 ...

  5. Java多线程详解(线程不安全案例)

    嗨喽-小伙伴们我又来了, 通过前面两章的学习,我们了解了线程的基本概念和创建线程的四种方式. 附上链接: 1.  Java多线程详解(基本概念)​​​​​​​ 2. Java多线程详解(如何创建线程) ...

  6. Java多线程设计模式之顺序控制-两个小案例

    Java多线程设计模式之顺序控制-两个小案例 案例一 两个线程,保证B线程执行完毕后再让A线程执行 思路一:使用wait/notify,需要synchronized关键字支持 思路二:使用LockSu ...

  7. Java多线程——三个多线程案例总结

    Java多线程--三个多线程案例总结   非常经典的三道多线程案例   1.写两个线程,一个线程打印1-52,另一个线程打印A~Z,     打印顺序为:12A34B-5152Z   2.编写一个程序 ...

  8. Java多线程案例:模拟12306火车站售票系统

    Java多线程案例:模拟12306火车站售票系统 该系统一共涉及到3个类: 车票(Ticket) 12306系统(System12306) 售票窗口(Window) 车票类,涉及三个属性: 起始站 终 ...

  9. Java多线程案例之阻塞队列

    ⭐️前面的话⭐️ 本篇文章将介绍Java多线程案例,阻塞队列,阻塞队列在普通队列的基础上多了两种情况,一是阻塞队列为空时,如果进行出队操作,会使当前线程阻塞,直到有新元素插入阻塞队列,该线程才被通知继 ...

  10. Java多线程案例之单例模式(懒汉,饿汉,枚举)

    ⭐️前面的话⭐️ 本篇文章将介绍Java多线程中的几个典型案例之单例模式,所谓单例模式,就是一个类只有一个实例对象,本文将着重介绍在多线程的背景下,单例模式的简单实现.

最新文章

  1. matlab 神经网络预测时间序列示例(水痘模型)
  2. 百度地图开发总结----3.判断一个点是否在一片区域内
  3. 介绍一个 Windows 10 资源管理器的替代工具 - Explorer++
  4. c语言可以发现注释错误,编译时可以发现注释中的错误_c语言中不允许使用
  5. 处女座的砝码 long double
  6. 海康威视网络摄像机连接、使用方法
  7. Mac 上 QuickTime Player 播放器以 1.1、1.2 倍速等更精确速度快进/快退播放的方法
  8. E45: 'readonly' option is set (add ! to override)
  9. python画平行四边形_利用transform skewX制作平行四边形导航菜单
  10. css3 画太极图——用一个div实现
  11. 【直击DTCC】自然语言技术在文智趋势分析产品的应用
  12. 深信服C++ 一面(技术面、70min、offer)
  13. 区块链学习路径,看这一篇就够了 | FISCO BCOS
  14. MySQL日期类型及默认设置
  15. android拓展笔记本,有道笔记Android版上线,拓展移动终端产品布局
  16. 内网穿透方法有哪些?路由器端口映射外网和软件方案步骤
  17. 关于java.lang.IllegalArgumentException: DrawerLayout must be measured with MeasureSpec.EXACTLY异常处理
  18. 【实验3】——目标的分辨能力
  19. 编辑MyEclipse的模板
  20. 用python 自动生成期权到期日的算法

热门文章

  1. 学科竞赛管理系统服务器错误,大学生学科竞赛管理系统的设计与实现
  2. 【嵌入式Linux应用开发】移植LVGL到Linux开发板
  3. HashMap排序题
  4. 小学生学计算机编程实例,用日常生活小例子来教孩子学编程
  5. 汉字笔画动图怎么做_汉字笔画动态图软件 汉字笔画大全
  6. java房屋出租系统
  7. qcc烧录工具/qcc全系列量产单个烧录工具烧录软件qcc3020/3040/5124/5126/5144
  8. H3C的发展历史和与华为的关系
  9. 老王python培训视频教程完整版
  10. 网络/Network - 应用层 - HTTP - GET 通过 Body 来发送数据 - 学习/实践