多线程 实际场景应用篇

Posted 狂风骤起

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程 实际场景应用篇相关的知识,希望对你有一定的参考价值。

以下示例均来自jdk concurrent包。
/**
* 有一个任务,它要等待其他几个任务
* 执行完毕 之后才能执行
*
*
* 倒计时器
*/
public class CountDownLatchTest {



public static void main(String[] args){
final CountDownLatch count = new CountDownLatch(2);
new Thread(){
public void run(){
try {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程"+Thread.currentThread().getName()+"正在执行...");
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程"+Thread.currentThread().getName()+"执行完毕 ");
count.countDown();

} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();



//任务2
new Thread(){
public void run(){
try {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程"+Thread.currentThread().getName()+"正在执行...");
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("线程"+Thread.currentThread().getName()+"执行完毕 ");
count.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
};
}.start();

try {
count.await();
System.out.println("主线程"+Thread.currentThread().getName()+"执行完毕 ");
} catch (InterruptedException e) {
e.printStackTrace();
}

}
}

/**
* 周末部门聚餐
* 所有人到齐了 之后 才能开始。。。
*
*
* 可循环的同步屏障 */
public class CyclicBarrierTest {


public static void main(String[] args){
final CyclicBarrier barrier = new CyclicBarrier(20);
ExecutorService threadPool = Executors.newCachedThreadPool();
//模拟20个用户
for(int i=1;i<=20;i++){
final int t=i;
Runnable r = new Runnable(){
public void run(){
//模拟每个人来的时间
try {
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println(t+" 用户到达"+(barrier.getNumberWaiting()+1)+"人到达");
barrier.await();
if(t==1){ //控制打印一条
System.out.println("人员全部到齐,开始吃饭");
}
Thread.sleep(300);
System.out.println(t+"用户吃完,可以回家 了");
} catch (Exception e) {
e.printStackTrace();
}
}
};
threadPool.execute(r);
}

threadPool.shutdown();
}
}

/**
* 团伙a 绑了B,放言要100万, 与家属c达到 一致意见在某个地方
* 交换人质,于是Ac同时来到交换地点,同时一手交钱一手交货
* 使用exchanger实现
*/
public class ExchangerTest {

public static void main(String[] args){
ExecutorService threadPool = Executors.newCachedThreadPool();
Exchanger<String> exchanger = new Exchanger<String>();

threadPool.execute(new Runnable() {
@Override
public void run() {
String data ="人质B";
try {
String response = exchanger.exchange(data);
System.out.println("绑架者用B换回"+response);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

//家属c
threadPool.execute(new Runnable() {
@Override
public void run() {
String data ="1000";
try {
String response = exchanger.exchange(data);
System.out.println("C1000万换回"+response);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});

threadPool.shutdown();
}
}

/**
* 信号量控制并发
* 20个人 2个窗口买票
*
*/
public class SemaphoreTest {
private void execute(){
Semaphore semaphore = new Semaphore(2);
//线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
//模拟20个线程
for(int i=0;i<20;i++) {
threadPool.execute(new MyTask(semaphore,i));
}
}

class MyTask implements Runnable{
private Semaphore semaphore; //信号 量 2个许可
private int userNo;
public MyTask(Semaphore semaphore,int userNo){
this.semaphore=semaphore;
this.userNo =userNo;
}
public void run(){
//执行买票

try {
//获取信号量许可,如果获取不到 在此阻塞
semaphore.acquire();

//如果 获取到, 可以往下执行 也就是买票
System.out.println("用户"+userNo+" 进入窗口,准备买票");
TimeUnit.MILLISECONDS.sleep(1000);

System.out.println("用户"+userNo+" 买票完成,准备离开 ");
TimeUnit.MILLISECONDS.sleep(1000);
System.out.println("用户"+userNo+" 买票完成,离开窗口 ");
semaphore.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args){
SemaphoreTest test = new SemaphoreTest();
test.execute();

}
}
 
 
 

以上是关于多线程 实际场景应用篇的主要内容,如果未能解决你的问题,请参考以下文章

Python的线程04 同步机制实际应用场景举例

Python的线程04 同步机制实际应用场景举例

《重学Java高并发》专栏开始连载:你是否懂Java高并发,一测便知(从实际应用场景中提炼多线程,理解多线程,不是面经,更胜面经)

《重学Java高并发》专栏开始连载:你是否懂Java高并发,一测便知(从实际应用场景中提炼多线程,理解多线程,不是面经,更胜面经)

Python的线程06 认识线程安全 文末送书

Python的线程06 认识线程安全 文末送书