Java学习:实际应用场景中的多线程没有start()解决方法
2022/3/1 20:51:46
本文主要是介绍Java学习:实际应用场景中的多线程没有start()解决方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
今天在做多线程练习的时候,参考资料给的是使用extends继承Thread类的方式创建的子类对象,天然带有start()方法
题目如下:
/** * 生产者-消费者问题 * 生产者最多生产20个产品,生产完就得等待 * 交由服务员来调度生产者和消费者 * 消费者没有能消费产品的时候,等待 **/
但是我本人是使用的implments runnable接口的方式来创建子类的多线程的。这一试不要紧,试完了发现BBQ了,在实际场景中,由于生产者和消费者虽然都实现了runnable接口,但是我在调用过程中,由于是implments runnable接口的方式,所以按照道理应该是要以Thread(runnable)的方式创建线程,然后借用Thread类本身来实现start()方法,但是我又创建对生产者和消费者对象,这也就导致了我new出来的生产者和消费者,没有使用Thread类创建,也没办法使用start()方法。
解决方法:
在一开始的过程中,我是这样设想的:
先看看thread类的start()方法怎么写的,我copy一份过来
于是我就去点进Thread类中查看start方法,后来发现里面很多变量是在之前就定义好的,我copy过来并不适用。
那么我就要开动我的小脑袋瓜了
既然我生产者和消费者实现了runnable接口,那我干脆在创建的生产者和消费者的基础上,再用Thread接口来实现好了
即:
Waiter w = new Waiter(); Producer p =new Producer(w); Consumer c1 = new Consumer(w); Consumer c2 = new Consumer(w); Thread t1 = new Thread(p); Thread t2 = new Thread(c1); Thread t3 = new Thread(c2);
多出一步来,豁然开朗,最后也是成功实现了题目要求
下面是完整代码:
import static java.lang.Thread.sleep; /** * 生产者-消费者问题 * 生产者最多生产20个产品,生产完就得等待 * 消费者没有能消费产品的时候,等待 * @author Dionysus_xu * @create 2022-03-01-17:30 */ public class PoC_Problem { public static void main(String[] args) { Waiter w = new Waiter(); Producer p =new Producer(w); Consumer c1 = new Consumer(w); Consumer c2 = new Consumer(w); Thread t1 = new Thread(p); Thread t2 = new Thread(c1); Thread t3 = new Thread(c2); t1.setName("生产者1"); t2.setName("消费者1"); t3.setName("消费者2"); t1.start(); t2.start(); t3.start(); } } class Waiter{ private int Produce = 0; public synchronized void createProduce(){ if(Produce < 20){ Produce++; System.out.println(Thread.currentThread().getName()+":生产了第" + Produce + "件产品"); notifyAll(); }else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } public synchronized void consumeProduce() { if(Produce > 0){ System.out.println(Thread.currentThread().getName()+":消费了第" + Produce + "件产品"); Produce--; notifyAll(); }else { try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } } class Producer implements Runnable{ private Waiter waiter = null; public Producer(Waiter waiter){ this.waiter = waiter; } @Override public void run() { while (true){ try { sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } waiter.createProduce(); } } } class Consumer implements Runnable{ private Waiter waiter = null; public Consumer(Waiter waiter){ this.waiter = waiter; } @Override public void run() { while (true){ try { sleep(240); } catch (InterruptedException e) { e.printStackTrace(); } waiter.consumeProduce(); } } }
这篇关于Java学习:实际应用场景中的多线程没有start()解决方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-13TiDB + ES:转转业财系统亿级数据存储优化实践
- 2024-05-09“2024鸿蒙零基础快速实战-仿抖音App开发(ArkTS版)”实战课程已上线
- 2024-05-09聊聊如何通过arthas-tunnel-server来远程管理所有需要arthas监控的应用
- 2024-05-09log4j2这么配就对了
- 2024-05-09nginx修改Content-Type
- 2024-05-09Redis多数据源,看这篇就够了
- 2024-05-09Google Chrome驱动程序 124.0.6367.62(正式版本)去哪下载?
- 2024-05-09有没有大佬知道这种数据应该怎么抓取呀?
- 2024-05-09这种运行结果里的10.100000001,怎么能最快改成10.1?
- 2024-05-09企业src漏洞挖掘-有意思的命令执行