首页 > 其他分享 >线程问题<2>

线程问题<2>

时间:2023-02-08 11:35:10浏览次数:30  
标签:int list System 问题 线程 println public out


面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法

能够支持2个生产者线程以及10个消费者线程的阻塞调用


1.使用wait和notify/notifyAll来实现

public class Test<T> {

private LinkedList<T> list = new LinkedList<T>();
private int MAX = 10;//最大容量
private int count = 0;//当前容器的个数

public synchronized void put(T t) {
while(list.size() == MAX) {
try {
System.out.println("生产者进入了等待");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.add(t);
System.out.println("生产者生产了" + t);
++count;
this.notifyAll();
}

public synchronized <T> T get() {
T t = null;
while(list.size() == 0) {
try {
System.out.println("消费者进入了等待");
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
t = (T) list.removeFirst();
System.out.println("消费者消费了" + t);
--count;
this.notifyAll();
return t;
}

public static void main(String[] args) throws InterruptedException {
final Test test = new Test();

for (int i = 0; i < 10; i++) {
new Thread() {
public void run() {
for (int j = 0; j < 5; j++) {
test.get();
}
}
}.start();
}

for (int i = 0; i < 2; i++) {
new Thread() {
public void run() {
for (int j = 0; j < 35; j++) {
test.put(j);
}
}
}.start();
}

Thread.sleep(1000);

System.out.println("容器中还有" + test.count + "个");

}

}



2.使用Lock和Condition来实现


public class Test51<T> {

final private LinkedList<T> list = new LinkedList();
private static int MAX = 10;
private int count = 0;

private Lock lock = new ReentrantLock();
private Condition p = lock.newCondition();
private Condition c = lock.newCondition();

public void put(T t) {
try {
lock.lock();
while(list.size() == MAX) {
System.out.println("生产者进入等待");
p.await();
}
list.add(t);
System.out.println("生产者生产了" + t);
++count;
c.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public <T> T get() {
T t = null;
try {
lock.lock();
while(list.size() == 0) {
System.out.println("消费者进入等待");
c.await();
}
t = (T) list.removeFirst();
System.out.println("消费者消费了" + t);
--count;
p.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
return t;
}

public static void main(String[] args) throws InterruptedException {
final Test51 t = new Test51();

for (int i = 0; i < 10; i++) {
new Thread() {
public void run() {
for (int j = 0; j < 5; j++) {
t.get();
}
}
}.start();
}

for (int i = 0; i < 2; i++) {
new Thread() {
public void run() {
for (int j = 0; j < 25; j++) {
t.put(j);
}
}
}.start();
}

Thread.sleep(1000);

System.out.println("还剩余" + t.count);
}

}




标签:int,list,System,问题,线程,println,public,out
From: https://blog.51cto.com/u_12182769/6043794

相关文章

  • 线程问题<1>
    实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束1.第一种方法是......
  • java多线程编程核心技术(1丶2章)
    java多线程编程第一章:实现多线程编程主要有两种方式,一种是继承Thread类,另一种是实现Runnable接口。使用继承Thread类的方式创建新线程时,最大的......
  • javaScript 高级语法 - class创建对象,继承 extends,super,类中this指向问题
    1.class创建对象classHuman{//类constructor(id,name){//构造器this.id=id;//成员变量this.name=name;}info(){//方法console.log("inf......
  • 关于mybatis resulttype 返回值异常的问题
    目录mybatisresulttype返回值异常例如:resulttype="student"但是当中有些字段为空例如:数据库字段为:s_name实体类字段为namemybatisresultType="map"的常见问题一、......
  • Request-获取请求参数中文乱码问题处理、请求转发
    Request获取请求参数中文乱码问题处理中文乱码问题:get方式:tomcat8已经将get方式乱码问题解决了post:会乱码解决:在获取参数前,设置request的......
  • 黑苹果中Memory modules misconfigured问题解决
    问题大致和这个差不多,头一样,下面的不一样:大致意思是,你的内存出现了错误设置,要么成对安装,要么把模块全插满。以前版本没有这个信息,那就一定是配置造成的。按照https://dor......
  • 记一次Java崩溃崩溃问题——IPv6 与 glibc的bug
    最近一段时间,项目组的后端和APP端进行联调的时候,会发现测试服务器的后端服务器会经常莫名其妙地崩溃,最后会生成一份崩溃日志(hs_err_pid.log)。日志的大概信息如下:##Afat......
  • MYSQL因IN的范围太大导致索引失效问题
    背景最近发现有个用于统计的门店串码激活数量的SQL特别慢,将其摘出来大致如下SELECTa.sku_idasskuId,a.store_idasstoreId,count(*)assaleQtyFROMall_imei_inf......
  • Redis(十四)——缓存问题
     1、缓存穿透(1)问题描述缓存和数据库中都没有数据。例如利用不存在的key恶意攻击,导致数据库压力过大(2)解决方案接口层增加参数校验,用户鉴权,id非法拦截。从缓存取......
  • java创建线程的方式有几种?
    java中创建线程的方式有多少种,这个问题也是众多纷纭,这个时候更应该参考官方文档(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html)了,文档很明确地指出......