javaseday12(线程,同步代码块 函数,线程安全,死锁)
来源:互联网 发布:sql select语句例子 编辑:程序博客网 时间:2024/06/03 18:12
sleep(time)必须指定睡眠时间 单位是毫秒到点自动唤醒
CPU的执行资格:可以被cpu处理 在处理队列中排队
CPU的执行权:正在被CPU处理
一个特殊的状态 :就绪(临时阻塞) 具备了执行的资格但是还没有获取资源(执行权)
创建线程的第一种方式:继承Thread类 cpu快速切换 导致线程切换
Thread 中有封装线程任务的方法
将自己的方法放在子类的run()中
创建线程的第二种方式:实现Runnable接口
1、定义类实现Runnable接口
2、覆盖接口中的run方法 将线程的任务代码封装到run方法中
3、通过Thread类创建线程对象,并将Runnable接口的子类对象作为构造函数的参数进行传递
因为线程的任务都封装在Runnable接口子类对象的run方法中 所以要在线程对象创建时就必须明确要运行的任务
4、调用线程对象的start方法开启线程
实现Runnable 接口的好处(区别):
1、将线程的任务从线程的子类中分离出来,进行了单独的封装
按照面向对象的思想将任务封装成对象
2、避免了java单继承的局限性
所以创建线程的第二种方式较为常见
子类已经继承了一个fu 可以用接口来扩展功能 让其中的内容作为线程的任务执行
因为不是Thread的儿子
所以要通过
Demo d = new Demo();
Thread t1 = new Thread (d);
Thread(Runnable target)
Thread
对象private Runnable r;
Thread(){}
Thread(Runnable r){
this.r=r;
}
public void run(){ //继承的时候该方法被 覆盖 接口的时候通过构造函数 传进去r 然后通过start 调用该方法
if(r!=null)
r.run();
}
public void start(){
run();
}
}
Runnable 仅仅是将线程的任务进行了对象的封装 而不需要继承Thread
Thread 的 run 也来自Runnable 不过做了一个默认的实现
用静态限制具有局限性 (有2个100张票要卖)
1个线程不能启动多次 算是在主线程异常 在主函数内的是主线程异常 run里面的才是其他线程异常
Ticket t = new Ticket(); //创建一个线程任务对象 通过Runnable接口
Thread t = new Thread(t);
Thread t1 = new Thread(t);
Thread t2= new Thread(t);
Thread t3= new Thread(t);
Demo r = new Demo();
Thread t = new Thread(r);
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t.start();
t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
r.flag = false;
t2.start();
t3.start();
}
}
class Demo implements Runnable{
private int num = 100;
boolean flag = true;
Object obj = new Object();
public void run() {
if (flag) {
while (true) {
synchronized (obj) {
show();
}
}
} else
while (true) {
this.show();
}
}
public synchronized void show() {
synchronized (obj) { //卡在这 一个this 一个 obj
if (num > 0) {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "..." + num--);
}
}
}
}
简单点的死锁
public static void main(String[] args) {
Demo r = new Demo(true);
Demo r1 = new Demo(false);
Thread t = new Thread(r);
Thread t1 = new Thread(r1);
t.start();
t1.start();
}
}
class Demo implements Runnable{
boolean flag = true;
Demo(boolean flag){
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 lock b");
}
}
}
}
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();
}
- javaseday12(线程,同步代码块 函数,线程安全,死锁)
- 线程、同步代码块、同步函数、死锁
- (笔记八)线程、同步代码块、同步函数、死锁
- Java多线程线程、同步代码块、同步函数、死锁
- java线程安全之同步函数和同步代码块
- 同步代码块解决线程安全
- 线程-同步代码块
- 线程同步---同步代码块
- 线程同步 同步代码块
- 饿汉式不用同步代码块实现线程安全的问题
- [java]线程--同步代码块
- Java-线程$同步代码块
- 线程同步 线程死锁
- 线程同步/线程死锁
- Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁
- Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁
- 黑马程序员_JavaSE基础13 之 线程创建 线程安全 同步代码块
- java中线程同步(线程安全)与死锁问题
- android 自定义控件--Path 基本用法
- parquet-thrfit 数据读写以及hive表读取
- 指针运算
- 数据库sql如何查询某个字段只含有数字和字母或者是汉字
- 设计模式6-代理模式
- javaseday12(线程,同步代码块 函数,线程安全,死锁)
- [SMOJ2072]长路
- [bzoj2521][Shoi2010]最小生成树 最小割
- mongodb 杂记
- 数据结构和算法部分
- 设计模式
- 微信小程序开发步骤讲解和实用小技巧
- MySQL查看表占用空间大小(转)
- 微信Redirect_uri参数错误解决方法