`
文章列表
倒计时器,某个线程可以等待这个倒计时指向0的时候开始执行: final CountDownLatch cdl = new CountDownLatch(10); for(int i = 0;i<10;i++){ final int index = i; new Thread(new Runnable(){ @Override public void run() { try { Thread.sleep(new Random().nextInt(5000)); } catch (InterruptedException e) ...
CyclicBarrier能实现的效果是多个线程同时执行,这些线程执行的时间不一。但是要求在某一个点上,需要这些线程都执行完毕了之后,全部线程才能往下执行。下面是示例程序: ExecutorService service = Executors.newCachedThreadPool(); final CyclicBarrier cyclicBarrier = new CyclicBarrier(3); for(int i = 0;i<3;i++){ Runnable runnable = new Runnable(){ Random random = ...
Semaphore可以运行指定个数的线程同时运行某段代码,而不是一般同步情况下的一个线程。下面的程序中,10个线程运行的时候,都必须先获得到Semaphore,运行完毕之后归还Semaphore,达到限制指定个数的多个线程同时执行的效果。 final Semaphore sp = new Semaphore(3,false); ExecutorService service = Executors.newCachedThreadPool(); for(int i = 1;i<10;i++){ final int index = i; service.exe ...
Lock和Condition是为了替代synchroinzed、wait、notify的,有点是更面向对象,功能上也更强大。下面是一个简单的例子: class Outputer { Lock lock = new ReentrantLock(); public void output(String str) { lock.lock(); try{ for (char c : str.toCharArray()) ...
有的时候,你可能会产生大量的线程,这些线程的执行可能是有规定的,比如同时只运行最多有3个线程在执行,这种情况就可以使用线程执行器。线程执行器的分为一下几种: 1)固定大小的 ExecutorService executorService = Executors.newFixedThreadPool(3);这个执行器表示不论多少个线程被装进这个执行器里面,同时在运行的最多只有3个。 2)单线程执行 ExecutorService executorService = Executors.newSingleThreadExecutor();这个和Executors.newFixed ...
线程同步(互斥) 同步的需求是指同一段代码,一个线程在执行的时候,不能有别的线程也在执行。 为此,Java提供了锁的机制: synchronized(lock){ // some code need synchronized }一个线程在执行到同步代码块的时候,就需要先拿到loc ...
最简单的需求,设定多长时间以后执行某个动作: public class MyTimerTask extends TimerTask{ @Override public void run() { System.out.println("task running..."); } }没三秒执行一次: Timer timer = new Timer(); timer.schedule(new MyTimerTask(), 3000);Timer提供不同的API实现不同的定时功能,例如: 1)定时到指定的时间执行(一次) 2)定时到指定的时间后每隔一段时间执行一次( ...
案例: /** * 客户拜访计划 * **/ @Entity @Table(name = "cus_visit") public class Visit { /** * 同行人 */ private Set<Employee> partners; @ManyToMany(targetEntity = Employee.class, cascade = { CascadeType.MERGE },fetch = FetchType.LAZY) @Cascade(value = { org.hibernate.annotations.Ca ...
首先定义一个AbstractRoutingDataSource,Spring给我们留了这样的接口,让我们方便的定义怎么切换数据源: public class DynamicDataSource extends AbstractRoutingDataSource { Logger logger = Logger.getAnonymousLogger(); @Override protected Object determineCurrentLookupKey() { String p = "a"; try{ HttpServletReques ...
适配器模式中分为类适配器和对象适配器。 类适配器 继承手头现在有的类,通过调用父类(现有类)的方法来实现客户端需要的接口。 客户端想要的接口: package com.oozinoz.simulation; /** * 火箭模拟 * 这是一个客户端已经使 ...
之前一直用多对一,即使是一对一也转换成多对一方式解决。今天逃不了要用一对一还是费了点功夫才搞定。 多对一关联关系的配置上,在两边分配配置多对一和一对多就行了。但是一对一的时候,两边都是@OneToOne,那么这个外键究竟会放到哪个表里面呢?当然,在实际意义来说,放在哪个表里面都合理。但是在Hibernate的配置上就应该是确定在某一张表的。在JPA的官方文档中有这样的说明: mappedBy public abstract java.lang.String mappedBy (Optional) The field that owns the relationship. This e ...
/** * 据说著名犹太历史学家 Josephus有过以下的故事: * 在罗马人占领乔塔帕特後,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到, * 于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数, * 直到所有人都自杀身亡为止。 * 然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置, * 于是逃过了这场死亡游戏。 * */ public class JosephusProblem { ...
队列接口定义,和栈接口一样: public interface Queue<Item> { /** * 添加一个元素 * @param item */ public void push(Item item); /** * 获取最后一个添加的元素,并将其从队列中删除 * @return */ public Item pop(); /** * 判断队列是否为空 * @return */ public boolean isEmpty(); /** * 获取队列当前的元素个数 * @return */ pub ...
栈接口定义: public interface Stack<Item> { /** * 添加一个元素 * @param item */ public void push(Item item); /** * 获取最后一个添加的元素,并将其从栈中删除 * @return */ public Item pop(); /** * 判断栈是否为空 * @return */ public boolean isEmpty(); /** * 获取栈当前的元素个数 * @return */ public int siz ...
代码利用栈来实现算术表达式的求值功能,仅用于举例说明栈的用例,没有考虑运算符的优先级,并且要求表达式的各个部分必须用空格分隔: package com.mycode.algorithms.stack; import java.util.HashMap; import java.util.Map; import java.util.Stack; public class Evaluate { static Stack<String> ops = new Stack<String>(); static Stack<Double> params = n ...
Global site tag (gtag.js) - Google Analytics