首页 > 其他分享 >多线程3

多线程3

时间:2023-04-03 21:35:56浏览次数:37  
标签:tv void 线程 new 多线程 public synContainer

Lock锁

ReentrantLock lock=new ReentrantLock();
class TestLock2 implements Runnable{
   int  ticketName=10;
   //定义lock锁
   private final ReentrantLock lock=new ReentrantLock();
   @Override
   public void run() {

       while (true){
           try {
               lock.lock();//加锁
               if (ticketName>0){
                   try {
                       Thread.sleep(1000);
                  } catch (InterruptedException e) {
                       throw new RuntimeException(e);
                  }
                   System.out.println(ticketName--);
              }else {
                   break;
              }
          }finally {
               lock.unlock();//解锁
          }

      }

  }
}

wait(); //表示线程一直被等待直到其他线程通知,与sleep不同,会释放锁

wait(long timeout); 指定一个等待的时间

notify() ; 唤醒一个处于等待状态的锁

notifyAll(); 唤醒同一个对象所有调用wait();方法的线程,优先级别高的线程优先调度



线程通信

管程法

 

wait(); //表示线程一直被等待直到其他线程通知,与sleep不同,会释放锁

wait(long timeout); 指定一个等待的时间

notify() ; 唤醒一个处于等待状态的锁

notifyAll(); 唤醒同一个对象所有调用wait();方法的线程,优先级别高的线程优先调度

//线程通信
//生产者与消费者
public class TestPC {
   public static void main(String[] args) {
       SynContainer synContainer=new SynContainer();
      new Productor(synContainer).start();
      new Consumer(synContainer).start();
  }


}

//被生产的食物
class Chicken{
   public int id;
   Chicken(int id){
       this.id=id;
  }
}

//生产者
class Productor extends Thread{
       SynContainer synContainer;
       Productor(SynContainer synContainer){
           this.synContainer=synContainer;
      }

   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           System.out.println("生产了"+i+"只鸡");
           synContainer.push(new Chicken(i));
      }
  }
}

//消费者
class Consumer extends Thread{
    SynContainer synContainer;
   Consumer(SynContainer synContainer){
       this.synContainer=synContainer;
  }

   @Override
   public void run() {
       for (int i = 0; i < 100; i++) {
           System.out.println("消费了"+synContainer.pop().id+"只鸡");
      }
  }
}

// 容器
class SynContainer{
   //定义容器的大小,(能装几只鸡)
   Chicken[] chickens=new Chicken[10];
   //容器的计数器
   int cont=0;

   //消费者放入产品
   public synchronized void push(Chicken chicken){
       //如果产品满了,等待消费者消费
       if (cont==chickens.length){
           //产品满了 ,停止放入产品
           try {
               this.wait();
          } catch (InterruptedException e) {

          }
      }else {
           chickens[cont] = chicken;
           cont++;
           this.notify();
      }
  }
   //消费者产品
   public synchronized Chicken pop(){
       Chicken chicken=null;
       //如果没有产品,就等待生产者放入产品
       if (cont==0){
           //没有产品,通知生产者
           try {
               this.wait();
          } catch (InterruptedException e) {
               throw new RuntimeException(e);
          }
      }
       cont--;
            chicken = chickens[cont];
               this.notify();

       return chicken;
  }
}

信号灯法

//生产者消费者问题2,信号灯法,立标志位解决
public class TestPc2 {
   public static void main(String[] args) {
       Tv tv=new Tv();
       new Player(tv).start();
       new Watcher(tv).start();

  }
}
//生产者===演员
class Player extends Thread{
   Tv tv;
   public Player(Tv tv){
       this.tv=tv;
  }

   @Override
   public void run() {
       for (int i = 0; i < 20; i++) {
           if (i%2==0){
               tv.play("快乐大本营");
          }else {
               tv.play("嗓子疼吃金嗓子");
          }
      }
  }
}

//消费者===观众
class Watcher extends Thread{
   Tv tv;
   public Watcher(Tv tv){
       this.tv=tv;
  }

   @Override
   public void run() {
       for (int i = 0; i < 20; i++) {
           tv.watch();
      }
  }
}

//产品==节目
class Tv{
   String voice;
   //flag标志位 演员表演,观众等待true
   //观众观看,演员等待 false
   boolean flag=true;
   //生产节目
public synchronized void play(String voice){
   if (!flag){
       try {
           this.wait();
      } catch (InterruptedException e) {
           throw new RuntimeException(e);
      }
  }
   System.out.println("演员表演了"+voice);
   //通知观众观看
   this.notifyAll();
   this.voice=voice;
   this.flag=!flag;

}
   //消费节目
   public synchronized void watch(){
   if (flag){
       try {
           this.wait();
      } catch (InterruptedException e) {
           throw new RuntimeException(e);
      }
  }
       System.out.println("观众观看了"+voice);
   //通知演员生产
        this.notifyAll();
       this.flag=!flag;
  }
}
 

标签:tv,void,线程,new,多线程,public,synContainer
From: https://www.cnblogs.com/wukangxiang/p/17284510.html

相关文章

  • 多线程1
    Thread   //继承Thread类,重写run方法,调用start开启线程//注意:线程开启不一定立即执行,由CPU调度执行publicclassDemo01extendsThread{//  publicvoidrun(){    for(inti=0;i<20;i++){      System.out.println("我在看代码==>"+i);......
  • 多线程2
    Join//join线程强制执行(插队)publicclassTestJoinimplementsRunnable{  @Override  publicvoidrun(){    for(inti=0;i<100;i++){​      System.out.println("我是vip==》"+i);   } }​  publicstaticvoidmain(......
  • 多线程同步与安全
    三大不安全线程//模拟不安全的买票publicclassTestBuyTicket{  publicstaticvoidmain(String[]args){    maiPiaomaiPiao=newmaiPiao();​    newThread(maiPiao,"小明").start();    newThread(maiPiao,"小红").start();    ne......
  • Java多线程
    1.可见性、原子性和有序性问题多线程有三大特性,分别是可见性、原子性和有序性。1.1可见性  在单核时代,所有的线程都是在一颗CPU上执行,CPU缓存与内存的数据一致性容易解决。因为所有线程都是操作同一个CPU的缓存,一个线程对缓存的写,对另外一个线程来说一定是可见的。一个线程......
  • Python 多线程死循环挂服务器时CPU占用过高问题
    我的某个程序里有这样一段代码,把程序挂在服务器爬取信息,因此用到死循环,同时又需要进行三个任务,于是使用了多线程。刚开始在死循环部分并没有加time.sleep(60),于是它一直在for循环,同时会进行.is_alive()(不确定这个消耗大不大),但总之这使得CPU占用过高。而加上sleep之后,直接就降下......
  • 多线程
    内容什么是线程如何创建线程线程的调度线程的一个设计模式:生产消费者模型线程池线程集合对象(侧重点)一、什么是线程进程:运行中的程序才可以称为进程,一个程序一个进程。宏观并行,微观串行。线程:1.任何一个程序都至少拥有一个线程,即主线程。但是java程序默认有两个线......
  • Java多线程(一篇从0讲透)
    多线程思维导图看天下:1.概述并行与并发并行:指两个或多个事件在同一时刻发生(同时发生)并发:指两个或多个事件在同一个时间段内发生。(交替执行)线程与进程进程:是指一个内存中运行的程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程记忆:进程的英文......
  • 多线程相关的问题(面试)
    1、线程创建的方式有哪几种1、继承Thread类;2、实现Runnable接口;3、实现Callable接口;4、使用Executor工具类创建线程池;5;使用ThreadPoolExecutor工具类创建线程池。2、线程的5种状态流转线程的状态如下状态:新建、就绪、运行、【阻塞】(等待(时间片用尽)、主动等待、挂起)、......
  • 结合 操作系统、Java多线程 学习并发编程
    为什么我们需要考虑并发?不考虑的话会出现什么问题?并发的多个程序(进程/线程)会对计算机资源进行争夺,如果不加以控制会出现混乱、严重影响程序运行效率,甚至错误首先是对CPU时间片的争夺对于多线程编程而言,由于创建线程后,线程的执行顺序是由调度程序控制的,也就是说各个线程的执行顺......
  • 多线程简介以及线程同步
    1.实现多线程1.1简单了解多线程【理解】是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能。1.2并发和并行【理解】并行:在同一时刻,有多个指令在多个CPU上同时执行。并发:在同一时刻,有多个指令......