注意主函数的名称
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() 方法就是出现 红色的字体的报错信息