「java多线程生产者」java多线程实现的代码

博主:adminadmin 2022-11-23 18:06:08 44

本篇文章给大家谈谈java多线程生产者,以及java多线程实现的代码对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

对于java多线程线程的几点疑惑(生产者消费者) ?

看了代码, 确实是shutdownNow()的问题, 可以使用shutdown(), 不要用shutdownNow()

shutdown()是表示service不再接收线程了, 即不要再submit线程进来了

shutdownNow()则是终止所有现在运行着的线程

submit不用说就是加入一个线程并运行, 但是要注意submit接收的是runnable或者callable, 你可以传一个实现runnable的类的对象进来, 也就是你的producer那样, 也可以传一个Thread进来, 因为Thread实际上也是一个实现了runnable的类

newCachedThreadPool()不用多说就是new一个线程池, 方便执行线程, 不用总是去生成线程, 因为这样很耗资源, 一般来说推荐用CachedThreadPool, 动态扩充的

又看了下代码, 你是要5秒钟后终止所有线程, 所以用shutdownNow()是正确的...., 你那些异常是producer和consumer里的sleep被interrupt后跑出的异常, 你可以在对应的异常捕获里写, 不是main函数sleep被interrupt了, interrupt就相当于终止线程了(是终止线程的一种方式)

class Consumer implements Runnable {

public void run() {

try {

while (true) {

// 消费苹果

System.out.println("消费者准备消费苹果: "

+ System.currentTimeMillis());

basket.consume();

System.out.println("消费者消费苹果完毕: "

+ System.currentTimeMillis());

// 休眠1000ms

Thread.sleep(1000);

}

} catch (InterruptedException ex) {

System.out.println("Consumer interrupted");

}

}

}

在这里捕获

java多线程关于消费者和生产者,求源程序,求大神解答。愿意提高报酬

自己看代码体会吧

import java.util.concurrent.BlockingQueue;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.LinkedBlockingQueue;

public class BlockingQueueTest {

 public static void main(String[] args) {

  ExecutorService service = Executors.newCachedThreadPool();

  BlockingQueueString blockingQueue = new LinkedBlockingQueueString(100);

  System.out.println("blockingQueue now contains "  + blockingQueue.size() + " unit");

  service.submit(new Consumer1(blockingQueue));

  gap(blockingQueue);

  service.submit(new Productor2(blockingQueue));

  gap(blockingQueue);

  service.submit(new Productor3(blockingQueue));

  gap(blockingQueue);

  service.submit(new Productor4(blockingQueue));

  gap(blockingQueue);

  service.submit(new Productor5(blockingQueue));

  gap(blockingQueue);

  

  service.shutdown();

 }

 private static void gap(BlockingQueueString blockingQueue) {

  try {

   Thread.sleep(1000);

  } catch (InterruptedException e) {

   // TODO Auto-generated catch block

   e.printStackTrace();

  }

  System.out.println("blockingQueue now contains "  + blockingQueue.size() + " unit");

 }

}

class Consumer1 implements Runnable{

 BlockingQueueString blockingQueue;

 

 public Consumer1(BlockingQueueString blockingQueue) {

  super();

  this.blockingQueue = blockingQueue;

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  System.out.println("Consumer1 start: need 10 units");

  for(int i = 0; i  10; i++){

   try {

    blockingQueue.take();

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  System.out.println("Consumer1 end: has got 10 units");

 }

 

}

class Productor2 implements Runnable{

 BlockingQueueString blockingQueue;

 

 public Productor2(BlockingQueueString blockingQueue) {

  super();

  this.blockingQueue = blockingQueue;

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  System.out.println("Productor2 start: put 5 units");

  for(int i = 0; i  5; i++){

   try {

    blockingQueue.put("Object");

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  System.out.println("Productor2 end: has put 5 units");

 }

 

}

class Productor3 implements Runnable{

 BlockingQueueString blockingQueue;

 

 public Productor3(BlockingQueueString blockingQueue) {

  super();

  this.blockingQueue = blockingQueue;

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  System.out.println("Productor3 start: put 5 units");

  for(int i = 0; i  5; i++){

   try {

    blockingQueue.put("Object");

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  System.out.println("Productor3 end: has put 5 units");

 }

 

}

class Productor4 implements Runnable{

 BlockingQueueString blockingQueue;

 

 public Productor4(BlockingQueueString blockingQueue) {

  super();

  this.blockingQueue = blockingQueue;

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  System.out.println("Productor4 start: put 100 units");

  for(int i = 0; i  100; i++){

   try {

    blockingQueue.put("Object");

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  System.out.println("Productor4 end: has put 100 units");

 }

 

}

class Productor5 implements Runnable{

 BlockingQueueString blockingQueue;

 

 public Productor5(BlockingQueueString blockingQueue) {

  super();

  this.blockingQueue = blockingQueue;

 }

 @Override

 public void run() {

  // TODO Auto-generated method stub

  System.out.println("Productor5 start: put 10 units");

  for(int i = 0; i  100; i++){

   try {

    blockingQueue.put("Object");

   } catch (InterruptedException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

   }

  }

  System.out.println("Productor5 end: has put 10 units");

 }

 

}

每个线程是隔了1s启动的, 结果

blockingQueue now contains 0 unit

Consumer1 start: need 10 units

blockingQueue now contains 0 unit

Productor2 start: put 5 units

Productor2 end: has put 5 units

blockingQueue now contains 0 unit

Productor3 start: put 5 units

Productor3 end: has put 5 units

Consumer1 end: has got 10 units

blockingQueue now contains 0 unit

Productor4 start: put 100 units

Productor4 end: has put 100 units

blockingQueue now contains 100 unit

Productor5 start: put 10 units

blockingQueue now contains 100 unit

关于Java多线程实现生产者和消费者的问题

你看你试试这个把那个消费者类里和生产者类private myProAndCon mpc;去掉

然后到class myProAndCon 这个主类里面添加private myProAndCon mpc;

这样就可以mpc就不会每次都是新创建的一个新类,而是共享一个类

你再试试

java多线程,怎么算出最佳的生产消费的配比比例?

这和生产者和消费者线程耗时有关,

最简单的一个公式:

生产者线程数*消费者平均耗时=消费者线程数*生产者平均耗时

得出: 生产者线程数/消费者线程数=消费者平均耗时/生产者平均耗时。

得出比例后就需要确定具体的线程数了,线程数需要根据业务量大小确实,这个没办法根据公式计算。同时,线程数还受到应用类型和cpu核心数的影响,一般说来,大家认为线程池的大小经验值应该这样设置:(其中N为CPU的个数)

如果是CPU密集型应用,则线程池大小设置为N+1

如果是IO密集型应用,则线程池大小设置为2N+1

总之线程的配置是一个比较繁琐的过程,需要通过不断的试验找到最佳的配置。

java 多线程 为什么不会打印一个生产者之后再打一个消费者 而是等生产者打印完才打生产者 求详解 谢谢

楼主,你的代码写的不对。

应该这样做,生产者每生产一个,生产完成后就通知消费者消费,这样才能做到生产一个消费一个。

解决的方法:

1、生产的地方加上同步等待,生产时当检查到库存有货,则等待(wait)消费者消费后再生产;生产时如果库存没货,则直接生产,生产完成则通知(notifyAll)消费者消费。

2、消费的地方加上同步等待,消费时如果发现没有库存,则等待(wait)生产者生产后再消费;消费时如果有库存,则直接消费,消费后通知(notifyAll)生产者生产。

代码我就不帮你写了,你上面的大概功能都能写出来,相信这两个细节问题你肯定能修改好。

具体修改的地方,就是你上面的类SyncStack中的pop、push方法修改。

有问题欢迎提问,满意请采纳!

java多线程生产者的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java多线程实现的代码、java多线程生产者的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-23,除非注明,否则均为首码项目网原创文章,转载请注明出处。