黑马程序员之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
原创粉丝点击