前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手撕代码 多线程手撕代码题

手撕代码 多线程手撕代码题

作者头像
韩旭051
发布2021-04-14 15:02:23
3140
发布2021-04-14 15:02:23
举报
文章被收录于专栏:刷题笔记刷题笔记

两个线程,线程1打印A,线程2打印B,两个线程同时并发,要求保证先打印A,后打印B

使用synchronized+ wait、notify

代码语言:javascript
复制
public class Main{
    static class Number{
        public int num = 1;
        Number(){}
    }
    public static  Number number = new Number();
    public static void main(String []args) {
        Thread a = new Thread(new Runnable(){
            @Override
            public void run() {
                synchronized(number){
                    try{
                        //避免假唤醒
                        while(number.num == 2) number.wait();
                    }catch(Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("A");
                    number.num = 2;
                    number.notify();
                }
            }
        });

        Thread b = new Thread(new Runnable(){
            @Override
            public void run() {
                synchronized(number) {
                    try{
                        while(number.num == 1) number.wait();
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    System.out.println("B");
                    number.num = 1;
                    number.notify();
                }
            }
        });
        b.start();
        try{
            Thread.sleep(1000);
        }catch(Exception e) {
            e.printStackTrace();
        }
        a.start();
    }

}

使用ReetrantLock+Condition

代码语言:javascript
复制
import java.util.concurrent.locks.*;
public class Main{
    public static  ReentrantLock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();
    public static int num = 1;
    public static void main(String []args) {
        Thread a = new Thread(new Runnable(){
            @Override
            public void run() {
                lock.lock();
                try{
                    while(num == 2) condition.await();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("A");
                num = 2;
                condition.signal();
                lock.unlock();
            }
        });

        Thread b = new Thread(new Runnable(){
            @Override
            public void run() {
                lock.lock();
                try{
                    while(num == 1) condition.await();
                }catch(Exception e) {
                    e.printStackTrace();
                }
                System.out.println("B");
                num = 1;
                condition.signal();
                lock.unlock();
            }
        });
        b.start(); 
        try{
            Thread.sleep(1000);
        }catch(Exception e){
            e.printStackTrace();
        };
        a.start();
    }

}

两个线程,一个线程打印奇数,一个线程打印偶数,控制先一个奇数后一个偶数这种顺序.使用ReetrantLock+Condition

代码语言:javascript
复制
import java.util.concurrent.locks.*;
public class Main{
    public static  ReentrantLock lock = new ReentrantLock();
    public static Condition condition = lock.newCondition();
    public static int num = 2;
    public static void main(String []args) {
        Thread a = new Thread(new Runnable(){
            @Override
            public void run() {
                try{
                    for(int i = 2; i <= 10; i=i+2) {
                        lock.lock();
                        while(num == 2) condition.await();
                        System.out.print(i);
                        num = 2; condition.signal();
                        lock.unlock();
                    }
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });

        Thread b = new Thread(new Runnable(){
            @Override
            public void run() {
                try{
                    for(int i = 1; i <= 10; i = i+2){
                        lock.lock();
                        while(num == 1) condition.await();
                        System.out.print(i);
                        num = 1; condition.signal();
                        lock.unlock();
                    }
                }catch(Exception e) {
                    e.printStackTrace();
                }
            }
        });
        a.start(); 
        try{
            Thread.sleep(10);
        }catch(Exception e){
            e.printStackTrace();
        };
        b.start();
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-04-13 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 两个线程,线程1打印A,线程2打印B,两个线程同时并发,要求保证先打印A,后打印B
    • 使用synchronized+ wait、notify
      • 使用ReetrantLock+Condition
      • 两个线程,一个线程打印奇数,一个线程打印偶数,控制先一个奇数后一个偶数这种顺序.使用ReetrantLock+Condition
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档