注意:部分代码为伪代码,注意虚假唤醒和死锁,对于同步快,使用同步集合类!!!
一,定义线程的方式
a,extends Thread
b,implements Runnable
二,产生线程的方法
a,new Thread().start();
b, Executors.newFixedThreadPool(10).execute(new Runnable(){...});
c, Executors.newCachedThreadPool().execute(new Runnable(){...});
d, Executors.newScheduledThreadPool(10).schedule(new Runnable(){...})
e, Executors.newSingleThreadExecutor(10).execute(new Runnable(){...})//可替补单线程
三,实现同步的方式
a,synchronized 关键字
b, new Semaphore(1); //信号灯还可以控制并发数量,
c, Lock lock = new ReentrantLock();
d, ReadWriteLock lock = new ReentrantLock();
注意:1,高并发时,防止重入,应循环检查当前状态
2, 在写锁释放前lock读锁,会将写锁降级为读写锁
3, 无论如何,最终需要释放锁
四,线程间通信的方式
a,this.wait(); this.notify()/this.notifyAll()
b, new BlockingQueue(1),new BlockingQueue(1);
//可使用阻塞队列来实现,因为其put(...)和take()均为阻塞方法
c, condition1 = new ReentrantLock().new Condition();
condition2 = new ReentrantLock().new Condition();
condition1.await(); ..执行过程.... condition2.signal();
五,线程内数据共享:
ThreadLocal<ThreadScopeSharedData> map = new ThreadLocal<ThreadScopeSharedData>();
建议:本地线程结合单例模式使用
五,应用场景
a,去东莞交友模式:
创建10个钢铁战士
召唤集合石: CyclicBarrier barrier = new CyclicBarrier(len);
集合: barrier.await();
解散:barrier.reset();
抵达东莞,会长喊话,给每个战士们,分配任务,最后统计成绩
CountDownLatch od = new CountDownLatch(1);
CountDownLatch ob = new CountDownLatch(n);
od.countDown();//让战士们自由发挥
ob.await();//等待战士们凯旋
new Runnable(){
void run(){
od.await();//会长分配任务细节
//任务细节:偷菜
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(pool);
播种:serice.submit(new CallAble(){....});
收获:serice.take();
ob.countDown();//每一个战士完成任务时,调用一次(此代码需要调用10次)
}
}
拓展:因网吧电脑数量有限,执行任务前可采用信号灯来控制战士们同时上机的数量
b,数据交换
Exchanger<Object> exchanger = new Exchanger<Object>();
线程一细节:
Object resultOne =exchanger.exchange(毛毛);
线程二细节:
Object resultTwo =exchanger.exchange(卡素);
执行结果,毛毛和卡素完成了被交换 ^ o ^
c,定时器
略~~
一,定义线程的方式
a,extends Thread
b,implements Runnable
二,产生线程的方法
a,new Thread().start();
b, Executors.newFixedThreadPool(10).execute(new Runnable(){...});
c, Executors.newCachedThreadPool().execute(new Runnable(){...});
d, Executors.newScheduledThreadPool(10).schedule(new Runnable(){...})
e, Executors.newSingleThreadExecutor(10).execute(new Runnable(){...})//可替补单线程
三,实现同步的方式
a,synchronized 关键字
b, new Semaphore(1); //信号灯还可以控制并发数量,
c, Lock lock = new ReentrantLock();
d, ReadWriteLock lock = new ReentrantLock();
注意:1,高并发时,防止重入,应循环检查当前状态
2, 在写锁释放前lock读锁,会将写锁降级为读写锁
3, 无论如何,最终需要释放锁
四,线程间通信的方式
a,this.wait(); this.notify()/this.notifyAll()
b, new BlockingQueue(1),new BlockingQueue(1);
//可使用阻塞队列来实现,因为其put(...)和take()均为阻塞方法
c, condition1 = new ReentrantLock().new Condition();
condition2 = new ReentrantLock().new Condition();
condition1.await(); ..执行过程.... condition2.signal();
五,线程内数据共享:
ThreadLocal<ThreadScopeSharedData> map = new ThreadLocal<ThreadScopeSharedData>();
建议:本地线程结合单例模式使用
五,应用场景
a,去东莞交友模式:
创建10个钢铁战士
召唤集合石: CyclicBarrier barrier = new CyclicBarrier(len);
集合: barrier.await();
解散:barrier.reset();
抵达东莞,会长喊话,给每个战士们,分配任务,最后统计成绩
CountDownLatch od = new CountDownLatch(1);
CountDownLatch ob = new CountDownLatch(n);
od.countDown();//让战士们自由发挥
ob.await();//等待战士们凯旋
new Runnable(){
void run(){
od.await();//会长分配任务细节
//任务细节:偷菜
CompletionService<Integer> service = new ExecutorCompletionService<Integer>(pool);
播种:serice.submit(new CallAble(){....});
收获:serice.take();
ob.countDown();//每一个战士完成任务时,调用一次(此代码需要调用10次)
}
}
拓展:因网吧电脑数量有限,执行任务前可采用信号灯来控制战士们同时上机的数量
b,数据交换
Exchanger<Object> exchanger = new Exchanger<Object>();
线程一细节:
Object resultOne =exchanger.exchange(毛毛);
线程二细节:
Object resultTwo =exchanger.exchange(卡素);
执行结果,毛毛和卡素完成了被交换 ^ o ^
c,定时器
略~~