黑马程序员之java多线程2
来源:互联网 发布:sql 数据库置疑 编辑:程序博客网 时间:2024/06/04 18:56
------ <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
一:线程间通信:多个线程在操作同一个资源,但是操作的动作却不一样。
1,将资源封装成对象。
2,将线程执行的任务也封装成对象。
class Res{private String name;private String sex;private boolean flag=false;public synchronized void set(String name,String sex){if(flag) try{this.wait();}catch(Exception e){}this.name=name;this.sex=sex;flag=true;this.notify();}public synchronized void out(){if(!flag) try{this.wait();}catch(Exception e){}System.out.println(name+"...."+sex);flag=false;this.notify();}}class Input implements Runnable{private Res r;Input(Res r){this.r=r;}public void run(){ int x=0;while(true){if(x==0) r.set("mike","man"); else r.set("丽丽","女女女女"); x=(x+1)&2; } }}class Output implements Runnable{ private Res r; Output(Res r) { this.r=r; } public void run() { while(true) { r.out(); } }}class InputOutputDemo{public static void main(String[] args){Res r=new Res();new Thread(new Input(r)).start();new Thread(new Output(r)).start();/*Input in=new Input(r);Output out=new Output(r);Thread t1=new Thread(in);Thread t2=new Thread(out);t1.start();t2.start();*/}}
等待唤醒机制,涉及的方法:
wait:将同步中的线程处于冻结状态。释放了执行权,释放了资格。同时将线程对象存储到线程池中。
notify:唤醒线程池中某一个等待线程。
notifyAll:唤醒的是线程池中的所有线程。
注意:
1,这些方法都需要定义在同步中。
2,这些方法必须要标识所属的锁。
你要知道A锁上的线程被wait了,那这个线程就相当于处于A锁的线程池中,只能A锁的notify唤醒。
为什么这三个方法都定义在了Object类中呢?
因为这三个方法都需要定义在同步中,并标识所属的同步锁,既然被锁调用,而锁又可以是任意对象,那么能被任意对象调用的方法一定定义在
Oblject中。
wait和sleep的区别:
wait:可以指定时间,也可以不指定时间。不指定时间,只能由对应的notify或者notifyAll来唤醒。
sleep:必须指定时间,时间到自动从冻结状态转成运行状态。
wait:线程会释放执行权,而且线程会释放锁。
sleep:线程会释放执行权,但是不释放锁。
二:线程其他的一些方法:
线程的停止:通过stop方法就可以停止线程。但是这个方法过时了。
停止线程:原理就是让线程运行的代码结束,也就是run方法结束。
怎么结束run方法呢?一般run方法里肯定定义循环,所以只要结束循环即可。
第一种方式:定义循环的结束标记。
第二种方式:如果线程处于了冻结了状态。是不可能读到标记的,这时就需要通过Thread类中的interrupt方法,将期冻结状态强制清除。让线程恢复
具备执行资格的状态,让线程可以读到标记,并结束。
interrupt():中断线程。
setPriority(int newPriority):更改线程的优先级。
getPriority:返回线程的优先级。
toString():返回该线程的字符串表现形式,包括线程的名称、优先级和线程组。
Thread.yield():暂停当前正在执行的线程对象,并执行其他线程。
setDaemon(true):将该线程标记为守护线程或者用户线程。当正在运行的线程都是守护线程时,java虚拟机退出。该方法必须在启动线程前调用。
join:临时加入一个线程的时候可以使用join方法。当A线程执行到了B线程的join方法时。A线程处于冻结状态,释放了执行权,B开始执行。A什么时候
执行呢?只有当B线程运行结束后,A才从冻结状态恢复到运行状态。
------- <a target="blank">android培训</a>、<a target="blank">java培训</a>、期待与您交流! ----------
0 0
- 黑马程序员之java多线程2
- 黑马程序员之java多线程
- 黑马程序员之-------------java多线程
- 黑马程序员-java-多线程2
- 黑马程序员java笔记之二-----多线程
- 黑马程序员---回顾之java多线程技术
- 黑马程序员之java多线程1
- 黑马程序员之java多线程3
- 黑马程序员之---多线程
- 黑马程序员-java多线程
- 黑马程序员--java 多线程
- 黑马程序员-java多线程
- 黑马程序员--Java多线程
- 黑马程序员--java多线程
- 黑马程序员:Java多线程
- 黑马程序员 Java多线程
- 黑马程序员---Java多线程
- 黑马程序员---多线程【java】
- 在海思3511上面实现wifi模块变成ap站点功能+wifi rt3070驱动的移植
- (未完成)matlab--矩阵运算技巧
- 需要手工register logfile的情况
- TQ210_裸机编程(三)——串口通信
- 第三章 数据预处理
- 黑马程序员之java多线程2
- ACM1、百度语言翻译机
- Android开发中尽量避免使用jpg图片
- 1019. 数字黑洞 (20)
- 在华为海思上面实现wpa_supplicant移植和最终连接上网
- rmmod: chdir(/lib/modules): No such file or directory 解决方
- 神奇的go语言(image网站开发)
- 基于Linux下的UDP编程
- 地铁站小偷卖手机