javaseday14(多线程 lock wait sleep)

注意主函数的名称

class  Resource22
{
public static void main(String[] args)
{
//创建资源。
Resource r = new Resource();
//创建任务。
Input in = new Input(r);
Output out = new Output(r);
//创建线程,执行路径。
Thread t1 = new Thread(in);
Thread t2 = new Thread(out);
//开启线程
t1.start();
t2.start();
}
}




class Resource
{
private String name;
private String sex;
private boolean flag = false;


public synchronized void set(String name,String sex)
{
if(flag)
try{this.wait();}catch(InterruptedException e){}
this.name = name;
this.sex = sex;
flag = true;
this.notify();
}


public synchronized void out()
{
if(!flag)
try{this.wait();}catch(InterruptedException e){}
System.out.println(name+"...+...."+sex);
flag = false;
notify();
}
}




//输入
class Input implements Runnable
{
Resource r ;
// Object obj = new Object();
Input(Resource r)
{
this.r = r;
}
@Override
public void run()
{
int x = 0;
while(true)
{
if(x==0)
{
r.set("mike","nan");
}
else
{
r.set("丽丽","女女女女女女");
}
x = (x+1)%2;
}
}
}
//输出
class Output implements Runnable
{


Resource r;
// Object obj = new Object();
Output(Resource r)
{
this.r = r;
}


@Override
public void run()
{
while(true)
{
r.out();
}
}
}


eclipse 优先修改第一个类名称 主函数推荐放最上面 设定问题

线程都睡着 也是种死锁现象

if判断标记 只有一次 会导致不该运行的线程运行了 出现数据错误的情况

while 判断标记解决了线程获取执行权后是否要运行

notify 只能唤醒一个线程 如果奔放唤醒了 本方 没有意义 而且while判断标记 +notify会导致死锁

notifyAll  解决了本方一定会唤醒对方线程

jdk1.5改成 5.0

synchronized 

同步代码块对于锁的操作是隐式的

jdk 1.5 以后将同步和锁封装成了对象 并将操作锁的隐式方式定义到了该对象中 将隐式动作变成了显示动作

锁的关闭动作 将锁的unlock 放在finally

lock 内部可以有多个监视器 可以唤醒对方的线程

lock 接口出现替代了同步代码块 或者同步函数将同步的隐式锁操作变成显式锁操作

同时更为灵活 可以一个锁上加上多组监视器

lock():获取锁 

unlock() 释放锁 通常需要定义finally代码块中


condition接口 出现替代了object 中的wait notify notifyall 方法

将这些监视器方法单独进行了封装 变成condition 监视器对象 可以任意锁进行组合

await();

signal();

signalall();

while 判断安全 每次 都会判断

wait 可以指定时间也可以不指定

sleep 必须指定时间

在同步中 对cpu 的执行权和锁的处理不同 

wait释放执行权 释放锁  需要别人notify

sleep释放执行权 不释放锁  它不需要被人notify

必须要释放执行权 不然别的程序都不能执行

同步内 线程可以活着(释放了锁 而且会强执行权)不只一个 但有锁的那个才能执行

停止线程()

1、stop()  不安全 直接灭亡

2、run()方法结束 

循环 要多次 写线程 另外开一条路  多线程

任务中都会有循环结构 控制住循环就可以结束任务

控制循环通常用定义标记来完成

但是如果线程处于冻结状态 就无法读取标记 如何结束呢?


interrupt 恢复线程的运行 清除 wait sleep 导致的阻塞状态

interrupt 方法将线程从冻结状态强制恢复到运行状态中让线程具备cpu 的执行资格

但是强制动作会发生InterruptedException 记得处理

都是守护线程 的话 jvm虚拟机退出

守护线程也叫用户(后台)线程 守护线程 和前台程序都正常开启 结束的时候 前台要手动 后台在前台程序都结束后自动结束

join()  线程要申请加入进来 运行 主线程就释放执行权和执行资格  等待线程终止

希望运行的时候临时加入线程运算时可以使用join方法

优先级越大 执行几率越高  优先级范围1~10   1 5 10 区别最大 默认5

但还是要抢资源

yield 释放执行权 让别人也执行

实现Runnable run里面可以传Thread  因为是子类的特有方法  但是这样就无法完成继承父类的方法 所以出现 抽象异常  应该被abstract

线程先运行 子类 后runnable 的任务 最后本身


printStackTrace() 方法就是出现 红色的字体的报错信息













  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值