高级API 快速入门之第八章 多线程02
一:多线程的特定方法
setPriority|getPriority---设置和获取线程的优先级
Thread.sleep(long millis)---线程睡眠
wait---线程等待
yield---线程让步(让当前抢到cpu的线程退出cup重新进行等待队列)
join---线程加入(加入更紧急的线程,让当前线程暂时阻塞)
notify|notifyAll--唤醒线程
suspend,resume一个是挂起,一个是唤醒(不推荐)
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相关推荐
- 高级API 快速入门之第七章 本地模拟下载文件
一:控制台版本的聊天互发消息 服务端: package com.zking.test;import java.io.BufferedReader; import java.io.Buffere ...
- 高级API 快速入门之第六章 用窗体实现Socket对话聊天案例
服务端: package com.zking.test;import java.awt.Font; import java.awt.event.ActionEvent; import java.awt ...
- 高级API快速入门之群聊天室【09】
一.控制台版本的群聊天室 其原理就是:通过死循环进行保存连接服务器的客户端,并创建一个容器来保存所有连接服务器的客户端 服务器: pa ...
- Keras functional API快速入门
2019独角兽企业重金招聘Python工程师标准>>> Keras functional API快速入门 The Keras functional API is the way to ...
- php yii2 api框架,Yii2框架制作RESTful风格的API快速入门教程
先给大家说下什么是REST restful REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移. 它首次出现在2000年Ro ...
- qq位置如何用启动百度地图定位服务器,腾讯位置服务API快速入门
前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key 引入js 把###替换成你申请的key 定义容器 设置好宽高度 设置 ...
- Pandas高级数据分析快速入门之三——数据挖掘与统计分析篇
Pandas高级数据分析快速入门之一--Python开发环境篇 Pandas高级数据分析快速入门之二--基础篇 Pandas高级数据分析快速入门之三--数据挖掘与统计分析篇 Pandas高级数据分析快 ...
- es高级客户端聚合查询api快速入门
//聚合查询@Testvoid Collection_query() throws IOException {SearchRequest searchRequest = new SearchReque ...
- J2EE快速入门之集合框架【02】
目录 一.LinkedList实现堆栈 1.实例化链表 2.压栈 3.出栈 4.计算堆栈的数量 5.实例化测试 6.结果显示: 二.Set接口下的实现类 1.HashSet (1)无序 (2)不重复 ...
- 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封装层 三 ...
最新文章
- linux memcached php 整合
- 玩转Mixly – 7、Arduino AVR编程 之 数组
- Javascript基本概念之数据类型
- 【跃迁之路】【500天】程序员高效学习方法论探索系列(实验阶段257-2018.06.20)...
- oracle获取表前几行,Oracle查询以获取同一表中相关行的先前值
- OSS内文件如何设置为无时间限制的下载链接
- C#语句之while语句
- centos 对某ip开放 防火墙端口_Centos防火墙设置与端口开放的方法
- 在线类图各种UML图分享
- 动态磁盘与基本磁盘的相互转换
- python爬取美女图片_python爬取百度美女图片
- 冰点还原密码查看工具
- JS window的若干属性和方法
- 常用传感器讲解二--火焰探测器-KY-026(FLAME)
- 词向量与词意-Glo Ve
- Excel的官方网站
- python 常用的几种定位方式
- Sharding-jdbc连接kingbasev8r6跨表分页
- 华为年终奖,小员工分百万!任正非:钱给多了,不是人才也变成了人才!
- SQL查询选修了全部课程的学生姓名