您的位置:首页 > 其它

多线程(3)

2015-07-03 23:25 197 查看

多线程,多生产多消费:

Lock接口:它的出现比synchronized有更多的操作。

lock():获取锁。

unlock():释放锁。

同步代码块或者同步函数的锁操作是隐式的。

JDK 1.5 Lock接口, 按照面向对象的思想,将锁单独封装成了一个对象。

并提供了对锁的显示操作。

Lock接口就是同步的替代。

1,将线程中的同步更换为Lock接口的形式。

替换完运行失败了,因为wait没有了同步区域,没有了所属的同步锁。

同步升级了。其中锁已经不是在任意对象,而是Lock类型的对象。

那么和任意对象绑定的监视器方法,是不是也升级了,有了专门和Lock类型锁的绑定的监视方法呢?

查阅api。 Condition接口替代了Object中监视器方法。

以前监视器方法封装到每一个对象中。

现在将监视器方法封装到了Condition对象中。

方法名为: await signal signalAll

监视器对象Condition 如何和Lock绑定呢?

可以通过Lock接口的new Condition()方法完成。

但是,问题依旧,一样唤醒了本方。效率仍旧低。

解决:使用两个Condition对象分别对生产者消费者等待唤醒即可

wait()和sleep()的区别

相同:可以让线程处于冻结状态。

不同点:

1,wait()可以指定时间,也可以不指定。

sleep() 必须指定时间

2,wait(), 释放cpu资源,释放锁

sleep(): 释放cpu资源,不释放锁

异常会提示发生在哪个线程上,

异常会结束线程任务,也就是可以结束所在线程。

***如何停止线程?

原理:让run方法结束。

线程任务通常都有循环。因此开启线程就是为了执行需要一些时间的代码。

只要控制住循环,就可以结束run方法,就可以停止线程。

控制循环弄个标识即可,定义变量。

t1.interrupt() //将t1中断了,从冻结状态强制唤醒,又判断循环。

**守护线程:即后台线程。

t2.setDaemon(true);//将t2标识为后台线程

前台都结束,后台也结束

**

t1.join();//等待该线程终止。

让出执行权让t1执行,直到t1终止。

***优先级

Thread.currenThread().toString() // 返回该线程的字符串表现形式,包括线程名称,优先级和线程组

设置优先级 setPriority(); 获取getPriority()

t1.setPriority(Thread.MAX_PRIORITY);//设置优先级数为10

yield() // 暂停当前正在执行的线程对象,并执行其他线程。



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: