Java多线程进一步的理解之------------线程池
public class ThreadPoolTest { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 1; i <=10 ; i++) { final int task = i; executorService.execute(new Runnable() { @Override public void run() { for (int j = 1; j <= 10; j++) { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + " is for " + " j= " + j +" task = " + task); } } }); } //executorService.shutdown(); } } 代码很简单就不解释了
看一下第二种方式
public class SemaphoreTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final Semaphore s = new Semaphore(3); for (int i = 0; i < 10; i++) {// 开是个对象 Runnable runnable = new Runnable() { @Override public void run() { try { s.acquire();// 判断对象的信号灯,亮就代表有线程 }catch (InterruptedException e) { e.printStackTrace(); } System.out.println("线程" + Thread.currentThread() + "进入,当前已有" + s.availablePermits()); try { Thread.sleep((long)(Math.random()*10000)); }catch (InterruptedException e){ e.printStackTrace(); } System.out.println("线程"+Thread.currentThread()+"即将离开"); s.release(); System.out.println("线程"+Thread.currentThread()+"线程已离开,当前已有"+s.availablePermits()); } }; service.execute(runnable);// 把对象装线程池 } } }
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java多线程进一步的理解------------实现读写锁
public class ReadAndWriteLock { public static void main(String[] args) { final QueueJ q = new QueueJ(); for (int i = 0; i <3 ; i++) { new Thread(){ @Override public void run() { while (true) { q.get(); } } }.start(); new Thread(){ @Override public void run() { q.put(new Random().nextInt(1000)); } }.start(); } } } class QueueJ { private Object data = null;//共享数据,只能有一个线程 private ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); public void get() { rwl.readLock().lock(); try { System.ou...
- 下一篇
Java多线程进一步的理解之------------缓存机制
public class CacheDemo { private Map<String,Object> cache = new HashMap<String,Object>(50); public static void main(String[] args) { } /* * 多个线程的并发执行,保证数据正确 * */ private ReadWriteLock rwl = new ReentrantReadWriteLock(); public Object getData(String key) { rwl.readLock().lock();// 加读锁,都可以读, Object value = null; try{ value = cache.get(key); if (value == null) { rwl.readLock().unlock(); // 释放读锁,都不可以读,让第一个线程去数据库中查数据,查好后输出, rwl.writeLock().lock(); // 加写锁,只有第一个线程可以加写锁添加成功, try { if (value ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8编译安装MySQL8.0.19
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS8安装Docker,最新的服务器搭配容器使用
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker使用Oracle官方镜像安装(12C,18C,19C)