多线程调度--求解

osc_28592051 发布于 08/11 16:11
阅读 444
收藏 0
今天做了一道题,真的好奇怪,求解
 
有线程A,B,C,D。其中A打印A,并sleep 3秒;B打印B,并sleep 4秒;C打印C,并 sleep 1秒,D打印D并sleep 2秒;
 
现要求A,B同时执⾏,C,D在A,B执⾏完之后同时执⾏;
打印结果为 A,B 等待4秒后 再打印C,D;
 
要求:不可让C,D 直接sleep 4秒后执⾏。同时符合以上预期;
 
⽬标:对多线程调度有⼀定理解,可以根据实际情况选⽤不同的并发模型。
 
加载中
0
o
osc_96584884
private static void method1() throws InterruptedException {
    CountDownLatch latch = new CountDownLatch(2);
    Thread threadA = new Thread(() -> {
        System.out.println("A");
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            latch.countDown();
        }
    });
    Thread threadB = new Thread(() -> {
        System.out.println("B");
        try {
            TimeUnit.SECONDS.sleep(4);
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            latch.countDown();
        }
    });

    Thread threadC = new Thread(() -> {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("C");
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });

    Thread threadD = new Thread(() -> {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("D");
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    });

    threadA.start();
    threadB.start();
    threadC.start();
    threadD.start();

    threadA.join();
    threadB.join();
    threadC.join();
    threadD.join();
}

 

0
o
osc_96584884

还有两个用 LockSupport 和 Semaphore 实现贴不上来...

osc_28592051
osc_28592051
这两个我要看过,应该是有什么敏感词
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部