Day12第十二天 java基础----------线程

来源:互联网 发布:湖南软件学院 编辑:程序博客网 时间:2024/04/30 02:08

------- android培训java培训、期待与您交流! ----------

1、线程间通信:
            其实就是多个线程操作同一个资源,只是操作的动作不同而已,notify() notifyall()全部
            用在同步里面也就是说用wait()和notify()需要标示的那个
2、因为wait()和notify()都在使用线程,因为要线程进行锁的操作,所以就要使用在同步用,
      因为只有同步才能具有锁的功能。
3、为什么这些操作的线程的方法要定义在Object中呢?
           因为这些方法在操作同步中的线程时都要标示他们,所操作的线程只有锁,只有同一个
 锁上的线程才可以被同一个锁的notify()唤醒。不可以对不同的锁中的线程唤醒,也就
 是说等待和唤醒必须为同一个锁。
4、锁可以为任意对象,可以被任意对象调用的方法定义Object中。
5、注意: notify() 和wait()一定要放在synchronized块中,否则出现异常。
6、对多个线程的生产者和消费者,为什么要用while来判断标识?
 因为是为了让被唤醒的线程再一次的判断标识符
7、在使用多线的过程中,要用到notifyAll来唤醒线程是因为如果要是用到notify啦唤醒线程的话
可能只会唤醒本方的线程,导致所有的线程出现等待的情况。
8、在JDk1.5中加入了新的特性,为了简化synchronized而出现了lock,是将synchronized换成了lock
将Object换成了Condition
9、停止线程的方法:
 (1)、stop(过时的方法)
 (2)、现在只有一种方法可以使run方法结束。
  开启多线程的时候运行代码通常是循环结构的,只要控制好循环就可以让run
  方法结束,也就是线程结束。
10、当线程处于冻结状态的时候就不会读取标志位,就不会结束,线程就会一直处于冻结状态。
当没有方法是冻结状态的线程回复到运行状态的时候就需要对冻结的线程进行冻结清除,强制
线程回到运行状态中去,这样就可以操作标志位让线程结束,这样就得使用Thread类中的interrupt()
中断线程。
11、守护线程:
 setDaemon(boolean on) 将该线程标记为守护线程或用户线程。守护线程依赖于前台的线程
 前台的线程结束 ,守护线程也就跟着结束了,有一点要注意就是守护线程的方法要在启动
 线程前进行调用。
12、interrupt()  中断线程。清除冻结状态。
13、join方法是获取cpu的执行权,然后让主线程处于冻结状态,join获取对象执行完成后,主线程就
解除冻结状态,临时加入线程的调用。主线程遇到谁的join方法就等待谁执行完成后在继续执行。
14、例如:
 当A线程执行到了B线程的join方法的时候,A线程就会等待,等待B线程全部执行完后A线程才
 可以继续执行,join用来临时加入线程的执行。
 代码如下:

 

class Demo implements Runnable {  public void run()  {   for(int x=0; x<70; x++)   {    System.out.println(Thread.currentThread().toString()+"....."+x);    Thread.yield();   }  } } class  JoinDemo {  public static void main(String[] args) throws Exception  {   Demo d = new Demo();   Thread t1 = new Thread(d);   Thread t2 = new Thread(d);   t1.start();   t2.start();   t1.join();//只有t1全部执行完毕后t2才开始执行   for(int x=0; x<80; x++)   {    //System.out.println("main....."+x);   }   System.out.println("over");  } }