`
文章列表
  多系统部署到一个 Tomcat 中,如果某一个系统崩溃可能会同时使其他系统不能正常工作,因为它们运行在同一个 JVM 上,就需要在同一个服务器中安装多个 Tomcat 来运行不同的 WEB 系统。   一、 Tomcat 版本选择 安装 JDK 版本 1.6.0 _10 以上,完成后设置以下环境变量: JAVA_HOME       C:\Program Files\Java\jdk1.6.0_11 CLASSPATH        .;%JAVA_HOME%\lib\dt.jar;% ...
一.创建KEY class Key { //private String keyName; public Key() { } public Key(String keyName) { //this.keyName = keyName; } public void createKey(String keyName) throws Exception { SecureRandom sr = new SecureRandom( ...
一.接口 public interface Foo { public void doThing(); } 二.接口实现 public class FooImpl implements Foo { @Override public void doThing() { System.out.println("Java Dynamic Proxy success"); } }  三.接口代理 public class FooProxy implements InvocationHandler { private Object o ...
Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+ ...
其实线程池的实现就是生产者消费者问题 的实现,理解了生产者消费者问题 就不会对线程池的实现感到神秘了,线程池在很多地方会用到,比如 tomcat 等各种中间容器的实现, Spring 对线程池的支持等,当然 mina 中也使用到了线程池的概念。 看下简单对线程池的实现代码,主要包括三个类,一个是线程池,一个是工作任务,一个是客户端进行任务添加。 任务类,比较简单,实现 Runnable 接口: //任务类,具体要执行的操作 public class Worker implements Runnable { private int id; ...
用于实现两个线程间的数据交换,每个线程在完成一定的任务后想与对方交换数据,第一个先拿出数据的线程将一直等待第二个线程拿着数据到来时,才能彼些交换数据. public class ExchangerTest { public static void main(String[] args) { final Exchanger<String> exchanger = new Exchanger<String>(); ExecutorService service = Executors.newCachedThreadPool(); service ...
CountDownLatch像倒计时计数器,调用它的countDown()方法就将计数器减1,当达到0时,所有等待者开始执行, 可以实现一个人通知多人,如裁判,也可以实现一个计划要多个领导签字后才能继续向下实施的情况. public class CountdownLatchTest { public static void main(String[] args) { ExecutorService service = Executors.newCachedThreadPool(); final CountDownLatch cdOrder = new CountDownLat ...
/** * 淘宝面试题:如何充分利用多核CPU,计算很大的List中所有整数的和 * @author weistar * */ public class CountListIntegerSum { private long sum;// 存放整数的和 private CyclicBarrier barrier;// 障栅集合点(同步器) private List<Integer> list;// 整数集合List private int threadCounts;// 使用的线程数 public CountListIntegerSum(Lis ...
它可以维护当前访问自身的线程个数,并提供了同步机制,使用它可以控制同时访问资源的线程个数,如实现一个文件允许的并发访问数. 单个信号灯对象可以实现互斥锁的功能,并且可以是由一个线程获得了"锁",再由另一个线程释放"锁",可应用于死锁恢复的场合. 注:还有另一个构造器Semaphore(int permits, boolean fair),其中fair为true表示先进来的先拿到灯,即公平,默认为false. public class SemaphoreTest { public static void main(String[] args) ...
一个锁内部可以有多个Condition,即有多路等待和通知,可参考JDK1.5的Lock和Condition实现的可阻塞队列的应用案例,在传统的线程机制中一个监视器对象上只能有一路等待和通知,要想实现多路等待和通知,必须嵌套使用多个同步监视器对象. 使用Condition可简单实现多路等待通知 public class TwoConditionCommunication { public static void main(String[] args) { final Business business = new Business(); new Thread(new ...
锁妙用: 读写锁:分为读锁和写锁,多个读锁不能互斥,读锁与写锁互斥,写锁与写锁互斥,这是由JVM自己控制的,只要上好相应的锁即可,如果你的代码只读数据,可以多人同时读,但不能同时写,那就上读锁;如果要修改数据,只能有一个人在写,且不能同时读取,那就上写锁,总之,读的时候上读锁,写的时候上写锁. 如使用readLock与writeLock实现缓存 public class CacheDemo { private Map<String, Object> cache = new HashMap<String, Object>(); private ReadWrit ...
应用于异步的任务执行,类似JS的回调方法. Future取得的结果类型与Callable返回的结果类型必须一致. 如异步执行方式: public class FutureTaskDemo { public static void main(String[] args) { // 初始化一个Callable对象和FutureTask对象 Callable<Object> pAccount = new PrivateAccount(); FutureTask<Object> futureTask = new FutureTask<Obje ...
传统线程间通信 // 传统的线程通信 public class TraditionalThreadCommunication { public static void main(String[] args) { final Business business = new Business(); new Thread(new Runnable() { @Override public void run() { for (int i = 1; i <= 50; i++) { business.sub(i); } } ...
多线程访问共享数据方式总结:   1.若每个线程执行的代码相同,可以使用同一个Runnable对象,这个Runnable对象中有那个共享数据,如卖票系统. 2.若每个线程执行的代码不同,这时需要用不同的Runnable对象,有以下几种方式来实现这些Runnable对象之间的数据共享: 2.1将共享数据封装在另外一个对象中,然后将这个对象逐一传递给各个Runnable对象,每个线程对共享数据的操作方法也分配到那个对象上去完成,这样容易实现针对该数据进行的各种操作的互斥与通信. 2.2将这些Runnable对象作为一个类中的内部类,共享数据作为这个外部类中的成员变量,每个线 ...
ThreadLocal用于实现线程内的数据共享,即对于相同的代码,多个模块在同一线程中运行时要共享一份数据,而在另外的线程中运行时又共享另外一份数据. 实现对ThreadLocal变量的封装,让外界不直接操作ThreadLocal变量,一是对基本类型的数据封装,这种应用相对少见,二是对对象类型的数据封装,较常见,即让某个类针对不同线程分别创建一个独立的实例对象. 以下是ThreadLocal常用封装: class MyThreadScopeData{ private MyThreadScopeData(){} public static MyThreadScopeData getT ...
Global site tag (gtag.js) - Google Analytics