一:多线程的特定方法

  1. setPriority|getPriority---设置和获取线程的优先级

  2. Thread.sleep(long millis)---线程睡眠

  3. wait---线程等待

  4. yield---线程让步(让当前抢到cpu的线程退出cup重新进行等待队列)

  5. join---线程加入(加入更紧急的线程,让当前线程暂时阻塞)

  6. notify|notifyAll--唤醒线程

  7. suspend,resume一个是挂起,一个是唤醒(不推荐)

  8. interrupt方法是中断当前阻塞了的线程

二:Thread和Runnable的区别

如果一个类继承Thread,则不适合资源共享。但是如果实现了Runable接口的话,则很容易的实现资源共享。
    总结:
    实现Runnable接口比继承Thread类所具有的优势:
        (1)适合多个相同的程序代码的线程去处理同一个资源

(2)可以避免java中的单继承的限制

(3)增加程序的健壮性,代码可以被多个线程共享,代码和数据独立

(4)线程池只能放入实现Runable或callable类线程,不能直接放入继承Thread的类

三:方法演示

  • Thread.sleep(毫秒);休眠的意思--------1秒= 1000毫秒

  • 10秒倒计时

class MyA implements Runnable {@Overridepublic void run() {for (int i = 10; i >= 1; i--) {System.out.println(i);try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
​MyA ma = new MyA();
new Thread(ma).start();​
  • 时刻获取当前的系统时间

class MyB implements Runnable {@Overridepublic void run() {// System.currentTimeMillis() 距离1970年1月1日至当今的毫秒值Date date = new Date(System.currentTimeMillis());while (true) {System.out.println(new SimpleDateFormat("HH:mm:ss:SSS").format(date));try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}// 打印当前的系统时间后,立刻要重新获取赋值date = new Date(System.currentTimeMillis());}}
}
MyB mb = new MyB();
new Thread(mb).start();

yield---线程让步(让当前抢到cpu的线程退出cup重新进行等待队列)--   放弃当前抢占CPU的资源

new Thread(mc, "小强").start();
new Thread(mc, "翠花").start();
class MyC implements Runnable {@Overridepublic void run() {System.out.println(Thread.currentThread().getName() + "---START");Thread.yield();// 线程礼让System.out.println(Thread.currentThread().getName() + "---END");}
}

join 强制性抢占CPU的资源

MyD md = new MyD();Thread thread = new Thread(md, "zz");thread.start();// 实例化主线程for (int i = 0; i <= 2000; i++) {// 判断:当主线程执行到200时,md强制抢占CPU的资源if (i == 200) {try {thread.join();// 强制抢占CPU的资源} catch (InterruptedException e) {e.printStackTrace();}}System.out.println(Thread.currentThread().getName() + "这是属于主线程。李白亲了.." + i);}}
}
class MyD implements Runnable {@Overridepublic void run() {for (int i = 1; i <= 1000; i++) {System.out.println(Thread.currentThread().getName() + "小强马上要追翠花了" + i);}}
}

问题:什么情况下使用Thread,什么情况下使用Runnable接口。
   1.现实生活中使用率最高的时Runnable接口                                                                                      2.一件事情多个人做——Runnable接口
   3.多件事情多个人做——Thread

案例:买票程序

public class Demo_03 {public static void main(String[] args) {/*** 卖票程序出现问题 1.一票多卖 2.票出现了0和负数* * 解决方案:使用延时sleep也无法解决*/// 1.需求:10张票3个窗口同时售卖buyTicket bt = new buyTicket();// 三个线程相当于三个人new Thread(bt, "悲伤的我").start();new Thread(bt, "牛逼的你们").start();new Thread(bt, "黄牛党").start();}
}// 自定义一个类实现售票
class buyTicket implements Runnable {private int ticket = 10;// 10张票@Overridepublic void run() {// 解决方法---通过同步锁 当某一个线程来买票时,进入后将其锁定,其它线程// 无法进入,必须要等这个线程从同步锁区域出来后,才能进入购买for (int i = 1; i <= 10; i++) {
//          synchronized (this) {
//          }// 模拟延时(出票)try {Thread.sleep(500);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}buy();
//          }}}/*** 实现方法不同步锁*/public synchronized void buy() {if(ticket ==0) {return;}System.out.println(Thread.currentThread().getName() + "买了第" + (ticket--) + "张票");}

死锁的概念:吃饭,要用两只筷子,当资源被两个人抢了,每人抢了一只筷子,而且还互相不愿意放弃自己的筷子,所有就形成了死锁。
   【总结】:线程跟线程之间,彼此占用彼此的资源都舍不得放手
    死锁的解决办法:关闭电源(线程这么多,找不到哪个资源死锁了)

  • 对象的wait方法只有在同步方法中调用才有用。
  • 它和sleep不同在于,sleep在阻塞的时候会仍然
  • 拥有对象的锁,而wait在阻塞时会先放掉对象的锁
  • 那么这样就不会产生死锁的情况发生。
  • 它是一种线程的安全策略 , notify是唤醒wait了的线程

高级API 快速入门之第八章 多线程02相关推荐

  1. 高级API 快速入门之第七章 本地模拟下载文件

    一:控制台版本的聊天互发消息     服务端: package com.zking.test;import java.io.BufferedReader; import java.io.Buffere ...

  2. 高级API 快速入门之第六章 用窗体实现Socket对话聊天案例

    服务端: package com.zking.test;import java.awt.Font; import java.awt.event.ActionEvent; import java.awt ...

  3. 高级API快速入门之群聊天室【09】

    一.控制台版本的群聊天室                     其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端              服务器: pa ...

  4. Keras functional API快速入门

    2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...

  5. php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程

    先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...

  6. qq位置如何用启动百度地图定位服务器,腾讯位置服务API快速入门

    前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key 引入js 把###替换成你申请的key 定义容器 设置好宽高度 设置 ...

  7. Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇

    Pandas高级数据分析快速入门之一--Python开发环境篇 Pandas高级数据分析快速入门之二--基础篇 Pandas高级数据分析快速入门之三--数据挖掘与统计分析篇 Pandas高级数据分析快 ...

  8. es高级客户端聚合查询api快速入门

    //聚合查询@Testvoid Collection_query() throws IOException {SearchRequest searchRequest = new SearchReque ...

  9. J2EE快速入门之集合框架【02】

    目录 一.LinkedList实现堆栈 1.实例化链表 2.压栈 3.出栈 4.计算堆栈的数量 5.实例化测试 6.结果显示: 二.Set接口下的实现类 1.HashSet (1)无序 (2)不重复 ...

  10. IPC进程间通信 D-Bus(Desktop Bus)快速入门(以libdbus-glib库为例)

    文章目录 一.D-Bus简介 1.D-Bus简介 2.不同IPC通信方式比较 3.D-Bus特性 二.D-Bus架构 2.D-Bus接口层 3.D-Bus总线层 测试demo 4.D-Bus封装层 三 ...

最新文章

  1. linux memcached php 整合
  2. 玩转Mixly – 7、Arduino AVR编程 之 数组
  3. Javascript基本概念之数据类型
  4. 【跃迁之路】【500天】程序员高效学习方法论探索系列(实验阶段257-2018.06.20)...
  5. oracle获取表前几行,Oracle查询以获取同一表中相关行的先前值
  6. OSS内文件如何设置为无时间限制的下载链接
  7. C#语句之while语句
  8. centos 对某ip开放 防火墙端口_Centos防火墙设置与端口开放的方法
  9. 在线类图各种UML图分享
  10. 动态磁盘与基本磁盘的相互转换
  11. python爬取美女图片_python爬取百度美女图片
  12. 冰点还原密码查看工具
  13. JS window的若干属性和方法
  14. 常用传感器讲解二--火焰探测器-KY-026(FLAME)
  15. 词向量与词意-Glo Ve
  16. Excel的官方网站
  17. python 常用的几种定位方式
  18. Sharding-jdbc连接kingbasev8r6跨表分页
  19. 华为年终奖,小员工分百万!任正非:钱给多了,不是人才也变成了人才!
  20. SQL查询选修了全部课程的学生姓名

热门文章

  1. 源码-PL/SQL从入门到精通-第二章-PL/SQL基本概念-Part 2
  2. Python 练习题6-13
  3. java前端学习路线_Java前端需要学什么?Java前端学习路线分享
  4. python之输出语句
  5. 中缀表达式、前缀表达式、后缀表达式
  6. 区块链技术指南学习(一)未来已来
  7. 小乌龟Git回滚重置及合并指定提交
  8. 凯撒密码 (Python实现)
  9. 在线文本代码对比工具
  10. Linux的vim编辑器常用命令