- 浏览: 523371 次
- 性别:
- 来自: 武汉
-
最新评论
文章列表
多系统部署到一个
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 ...