多线程join daemon

来源:互联网 发布:超级sql注入工具教程 编辑:程序博客网 时间:2024/06/06 04:20

java.lang.Thread
1.Thread.yield() 让当前线程让出cpu抢占权具有谦让之意,瞬时
2.Thread.sleep() 让当前线程休眠指定的毫秒数
3.Thread.join 当前线程等待指定的线程结束后才能继续运行

    join

    p1.join() 等待p1线程执行完毕 才继续往下走

4.daemon 守护,服务员

  Thread.setDaemon(true);

  为其他线程提供服务的线程

  若进程中剩余的线程都是守护线程的话,则进程终止了

5.-- 原子性操作

6.线程间通信,共享资源问题

 锁 防止并发访问 从并行改成串行

 参照物,锁旗标

synchronized(){

}

----------------------------------------------------------------------

class Player extends Thread{

  private String name;

  private int time;

  public MyThread(String name, int time){

    this.name=name;

    this.time = time;

  }

  public void run(){

      print(name+"is gone");

      try{

        Thread.sleep(time);

      }

      catch(Exception e){

      }

      print(name+"come"+time);

   }

}


class ThreadDemo3{

  public static void main(String[] agrs){

    Player p1 = new Player("x",3000);

    Player p2 = new Player("y",1000)

    p1.start();  //线程里面run方法是系统调用的 我们告诉它start

    p2.start(); //如果一定要调用run  那他就不是多线程 而是一个普通函数调用

   try{

      p1.join();

      p2.join();

   } 

   catch{

  }

    print("begin");

  }

}

-----------------------------------------------------------------

class Box extends Thread{

  private String no;

  private int time;

  public Box(String no, int time){

    this.no=no;

    this.time = time;

  }

  public void run(){

    print(no+"包房开始消费");

    try{

      Thread.sleep(time);

    }     

    catch(Exception e){

      

    }

    print(no+"消费时间"+time);

   }

}


class Waiter extends Thread{
  public void run(){
    while(true){
      print(new java.util.Date());
      try{
        Thread.sleep(1000);
      }
      catch(Exception e)

    }
  }

}

class ThreadDemo4{

  public static void main(String[] args){

    Box box1 = new Box("No1",3000);

    Box box2= new Box("No1",3000);

    Waiter w = new Waiter();  //设置线程是守护线程

    w.setDaemon();

    box1.start();

    box2.start();

    w.start();

  }

}

问题在于 消费结束了 waiter还在打印

--------------------------------------------------

java里面不存在全局变量

----------------------------------------------

class Saler extends Thread{

  static int tickets = 100;

  private String name;

  public Saler(String name){

    this.name = name;

  }

  public void run(){

    while(ticket>0){

      print(name+":"+(ticket--));  //ticket--原子操作 如果变成ticket = ticket--; 就会有问题

   }

  }

}


main:

  Saler s1 = new Saler("S1");

  Saler s2 = new Saler("S2");

  s1.start();

  s2.start();

----------------------------------------------------------

Saler:

static int tickets =100;

//锁旗标

static Object lock = new Object();

public void run(){

  while(true){

    int t = getTicket();

    if(t==-1){

      return;

    }

    else{

      print(name+":"+t);

    }

  }

}

public int getTicket(){

  synchronized(lock){

  int temp = tickets;

  tickets = tickets - 1;

  return t<1 ? -1: t;

  }

  return -2;//永远都用不到 只是从语法角度来说

}


原创粉丝点击