Java Day 13
线程的状态
被创建 运行 冻结 消亡
被创建--start()--> 运行
运行----run()----> 消亡
stop()
运行---sleep(time)---> 冻结
wait()-->
<--notify()
cpu 执行资格 被cup处理、处于队列中
cpu 执行权 正在被cpu处理
创建线程的第二种方法
实现Runnable接口
Thread t1 = new Thread(d)//d是实现Runnable接口类创建的对象
1、定义类实现Runnable接口
2、覆盖接口中的run方法,将线程任务封装
3、通过Thread类创建线程对象,将对象作为线程构造函数的参数进行传递
4、调用线程对象的start方法
细节
单独进行封装
线程安全问题
1、多线程操作共享数据
2、操作共享数据的线程代码有多条
同步代码块
将多条操作共享数据的线程代码封装起来,只允许一个线程访问
synchronized(对象){ 代码 }
同步代码块 利弊
利 解决了线程的安全问题
弊 效率降低
同步的前提 同步中必须有多个线程使用同一个锁
同步函数
同步函数的锁
同步函数使用的锁是this
静态同步函数的锁
函数所属字节码文件对象
this.getClass();
类.class
class Ticket implements Runnable{ //extends Thread
private int num = 100;
Object obj = new Object();
boolean flag = true; public void run(){
//Object obj = new Object();
if(flag){
while(true){
show();
if(num==0)
return;
}
}else{
while(true){
synchronized(this){
if(num>0){
try{
Thread.sleep(10);
}catch(InterruptedException e){
}
System.out.println(Thread.currentThread().getName()+"...block..."+num--);
}
}
if(num==0)
return;
//}
}
} } public synchronized void show(){
if(num>0){
try{
Thread.sleep(10);
}catch(InterruptedException e){ }
System.out.println(Thread.currentThread().getName()+"...func..."+num--);
}
}
} public class SaleTicketsDemo{
public static void main(String[] args){
/*Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket(); t1.start();
t2.start();
t3.start();
t4.start();*/
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t); t1.start();
try{Thread.sleep(10);}catch(InterruptedException e){ }
t.flag = false;
t2.start(); }
}
单例模式 的多线程问题
class Single{
private static Single s = null;
private Single(){}
public static Single getInstance(){
if(s==null){
synchronized(Single.class){
if(s==null){
s = new Single();
}
}
}
return s;
}
}
死锁
1、同步的嵌套
class Test implements Runnable{
private boolean flag;
Test(boolean blag){
this.flag = flag;
}
public void run(){
if(flag){
while(true){
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+" if locka...");
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+" if lockb...");
}
}
}
}else{
while(true){
synchronized(MyLock.lockb){
System.out.println(Thread.currentThread().getName()+" else lockb...");
synchronized(MyLock.locka){
System.out.println(Thread.currentThread().getName()+" else locka...");
}
}
}
}
}
}
class MyLock{
public static final Object locka = new Object();
public static final Object lockb = new Object();
}
class DeadLockTest{
public static void main(String[] args){
Test a = new Test(true);
Test b = new Test(false); Thread t1 = new Thread(a);
Thread t2 = new Thread(b);
t1.start();
t2.start();
}
}
Java Day 13的更多相关文章
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- linux下java.io.IOException: Cannot run program "/opt/jdk/jre/bin/java": error=13, Permission denied
linux下启动jetty时报: [root@mv01 jetty-distribution-9.2.14.v20151106]# java -jar start.jar java.io.IOExce ...
- 033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结
033 01 Android 零基础入门 01 Java基础语法 03 Java运算符 13 运算符和表达式知识点总结 本文知识点:运算符和表达式知识点总结 前面学习的几篇文都是运算符和表达式相关的知 ...
- Java SE 13 新增特性
Java SE 13 新增特性 作者:Grey 原文地址:Java SE 13 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
- Java Hour 13 集合基础
有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为13 Hour,请各位不吝赐教. Java 中的集 ...
- JAVA必备——13个核心规范
标准的价值: 你听过这句话吗?"一流企业做标准.二流企业做品牌.三流企业做产品!"我时我就在想,做标准的企业就是一流的?卖产品就是三流公司?而坐产品或者加工的公司,即使说销售量非常 ...
- JAVA进阶13
间歇性混吃等死,持续性踌躇满志系列-------------第13天 1.查看线程的运行状态 package code0327; class Demo01 implements Runnable { ...
- Java虚拟机13:Java类加载机制
前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用.而虚拟机如何加载这些.class文件?.class文件的信息 ...
- centos8安装java jdk 13
一,查看本地centos的版本 [root@localhost lib]# cat /etc/redhat-release CentOS Linux release 8.1.1911 (Core) 说 ...
- Thinking in Java——笔记(13)
Strings Immutable Strings Objects of the String class are immutable. Every method in the class that ...
随机推荐
- meta基础知识
H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 <meta name="viewport" content="width=device-width,initia ...
- Oracle笔记 一、oracle的安装、sqlplus的使用
1. 首先你得安装Oracle数据库服务器端和客户端软件,在安装过程中要注意的是,选择oracle的安装目录,切记不要用中文目录或的带空格的目录. 下载地址: http://hi.baidu.com/ ...
- LINE最新版6.5.0在iOS上的删除信息取证
iOS: 9.3.2版 LINE: 6.5.0版 取出LINE的数据库 Line.sqlite,路径如下所示: 检视删除的信息,发现还有不少残留,虽然都是片段,但拼拼凑凑总还是能有些蛛丝马迹,毕竟,总 ...
- 【风马一族_php】PHP与Mysql建立连接
让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache ../apache/conf/httpd.conf 创建p ...
- [原]NYOJ 括号匹配系列2,5
本文出自:http://blog.csdn.net/svitter 括号匹配一:http://acm.nyist.net/JudgeOnline/problem.php?pid=2 括号匹配二:htt ...
- 刚开始学IOS遇到的类和方法
框架:Core FoundationCFGetRetainCount. 类:NSRunLoop.NSAutoreleasePool.NSStringFormClass.UIApplicationMai ...
- PHP二维数组根据某个键名排序
$result = array( array( "amount": "11.00", "date": ...
- C# 多线程操作样例
using System; using System.Threading; //引用多线程 namespace ThreadTest { public class Alpha { public voi ...
- Mapreduce中的字符串编码
Mapreduce中的字符串编码 $$$ Shuffle的执行过程,需要经过多次比较排序.如果对每一个数据的比较都需要先反序列化,对性能影响极大. RawComparator的作用就不言而喻,能够直接 ...
- python批量导出导入MySQL用户的方法
这篇文章主要介绍了 数据库迁移(A -> B),需要把用户也迁移过去,而用户表(mysql.user)有上百个用户.有2种方法进行快速迁移: 1,在同版本的条件下,直接备份A服务器的mysql数 ...