Java多线程指定资源可以被多少个线程同时访问
2017-08-14 10:04
295 查看
通常情况下对公共资源指定可被多少个线程访问,通过设置同时允许访问的线程个数,每被一个线程访问,将该变量减一,当变量小于等于0时调用wait函数等待。一个线程访问资源结束后将变量加一,同时通知因wait而阻塞的线程。
下面模拟办理业务时只有5个窗口,每一个窗口同时只能接待一位客户,一位客户办理完成后才能办理下一位客户。
方法一:
方法二:
也可以采用JDK5中java.util.concurrent包引入的Semaphore解决。
打印输出
下面模拟办理业务时只有5个窗口,每一个窗口同时只能接待一位客户,一位客户办理完成后才能办理下一位客户。
方法一:
public class ThreadDemo2 { final public static int total=10; public static void main(String args[]) { Runnable customer = new Runnable() { volatile int avaliableThread = 5; volatile int count = 0; public void run() { int time = (int) (Math.random() * 10 + 3); int num; synchronized (this) { while (avaliableThread <= 0) { try { wait();//允许访问的线程个数小于等于0时,等待 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } avaliableThread--; num=++count; } try { System.out.println("正在为" + num + "办理业务,需要" + time + "s"); Thread.sleep(time * 1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (this) { avaliableThread++; if (avaliableThread > 0 && count < total) { System.out.println("第" + num + "办理完业务,有请下一位!"); notify();//允许访问的线程个数大于0时,并且还有客户,通知等待的线程 } else { System.out.println("第" + num + "办理完业务,没客户了,休息中!"); } } } }; for (int i = 0; i < total; i++) { new Thread(customer).start(); } } }
方法二:
也可以采用JDK5中java.util.concurrent包引入的Semaphore解决。
package amazingtest; import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String args[]){ Runnable customer=new Runnable() { final Semaphore semaphore=new Semaphore(5, true); volatile int count=1; public void run() { int time=(int) (Math.random()*10+3); int num=count++; try { semaphore.acquire(); System.out.println("正在为"+num+"办理业务,需要"+time+"s"); Thread.sleep(time*1000); if(semaphore.hasQueuedThreads()){ System.out.println("第"+num+"办理完业务,有请下一位!"); }else{ System.out.println("第"+num+"办理完业务,没客户了,休息中!"); } semaphore.release(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; for(int i=0;i<10;i++){ new Thread(customer).start(); } } }
打印输出
正在为2办理业务,需要3s 正在为3办理业务,需要8s 正在为5办理业务,需要4s 正在为1办理业务,需要10s 正在为4办理业务,需要12s 第2办理完业务,有请下一位! 正在为7办理业务,需要11s 第5办理完业务,有请下一位! 正在为6办理业务,需要4s 第6办理完业务,有请下一位! 第3办理完业务,有请下一位! 正在为8办理业务,需要12s 正在为9办理业务,需要7s 第1办理完业务,有请下一位! 正在为10办理业务,需要8s 第4办理完业务,没客户了,休息中! 第7办理完业务,没客户了,休息中! 第9办理完业务,没客户了,休息中! 第10办理完业务,没客户了,休息中! 第8办理完业务,没客户了,休息中!
相关文章推荐
- 如何确保N个线程可以访问N个资源同时又不导致死锁
- spring如何可以同时访问静态资源和Action
- 多线程Demo-Semaphore 控制同时访问资源的线程个数
- 多个线程同时访问资源
- spring如何可以同时访问静态资源和Action
- (C#) 线程操作 - 限制可同时访问某一资源或资源池的线程数。Semaphore 类。Mutex类
- 多个线程可能会试图同时访问某个对象。在多个线程同时争相访问某个对象的同时,如果一个线程修改了资源,有些线程可能会收到无效状态。例如,如果某个线程读取对象的字段,同时另一线程正在修改该字段,则第一个线程可能会收到无效的字段状态。这种情况称为竞用情况。
- Semaphore (通常用于限制可以访问某些资源(物理或逻辑的)的线程数目)
- nginx和tomcat搭配使用,让nginx可以访问tomcat下面的静态资源
- 一个进程(Process)最多可以生成多少个线程(Thread),★firecat推荐★
- linux下使用线程锁互斥访问资源
- 讨论:一个进程(Process)最多可以生成多少个线程(Thread)
- AsyncHttpClient 可以被多个线程同时使用么?
- 多线程访问同一资源第二步 : 线程设置 以及 线程打印 用synchronized解决数据不匹配问题
- NET 中多线程间资源共享与访问
- Servlet3.0中WEB-INF\lib下的jar包中的资源可以直接通过浏览器访问
- 网站建设服务器1M带宽支持多少人同时访问?
- 一个进程(Process)最多可以生成多少个线程(Thread)