java多线程经典编程题

题目一:子线程循环2次,主线程循环2次,然后子线程循环2次,主线程循环2次,这样循环10次;

public class Demo2 {
    static class Mywork {
        private volatile boolean flag=true;//代表是否等待
        private synchronized void sub(){
            while (! flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 2; i++) {
                System.out.println("sub run "+ i);
            }
            flag=false;
            this.notify();
        }
        private synchronized void mainRun(){
            while (flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int i = 0; i < 2; i++) {
                System.out.println("main run----------- "+i);
            }
            flag=true;
            this.notify();
        }
    }
    public static void main(String[] args) {
        Mywork mywork=new Mywork();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    mywork.sub();
                }
            }
        }).start();

        for (int i = 0; i < 10; i++) {
            mywork.mainRun();
        }
    }
}

打印结果:

sub run 0
sub run 1
main run----------- 0
main run----------- 1
sub run 0
sub run 1
main run----------- 0
main run----------- 1
...
...此处省略
...
sub run 0
sub run 1
main run----------- 0
main run----------- 1

用显示锁的方式:

public class LockCondtionDemo {
    private static class Mywork{
        private volatile boolean flag=true;//是否等待
        private Lock lock=new ReentrantLock();
        private Condition condition=lock.newCondition();
        public void sub(){
            try{
                lock.lock();
                while (!flag){
                    try {
                        condition.await();//释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("sub run ----------------");
                flag=false;
                condition.signal();
            }finally {
                lock.unlock();//这里一定要释放锁
            }
        }
        public void main(){
            try{
                lock.lock();
                while(flag){
                    try {
                        condition.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("main run");
                flag=true;
                condition.signal();
            }finally {
                lock.unlock();
            }
        }
    }
    public static void main(String[] args) {
        Mywork mywork=new Mywork();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    mywork.sub();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 5; i++) {
                    mywork.main();
                }
            }
        }).start();
    }
}

题目二:写两个线程,一个线程打印152,另一个线程打印AZ,打印顺序是12A34B...5152Z;

public class Demo1 {
    static class Behaver{
        private volatile boolean flag=true;
        private int count=1;
        public synchronized void printNum(){
            while(!flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.print(count*2-1);
            System.out.print(count*2);
            flag=false;
            this.notify();
        }
        public synchronized void printChar(){
            while(flag){
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.print((char)(count+'A'-1));
            count++;
            flag = true;
            this.notify();
        }
    }

    public static void main(String[] args) {
        Behaver behaver=new Behaver();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    behaver.printNum();
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 26; i++) {
                    behaver.printChar();
                }
            }
        }).start();
    }
}

打印结果:

12A34B56C78D910E1112F1314G1516H1718I1920J2122K2324L2526M2728N2930O3132P3334Q3536R3738S3940T4142U4344V4546W4748X4950Y5152Z
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,154评论 1赞 18
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,647评论 1赞 15
  • 该文章转自:http://blog.csdn.net/evankaka/article/details/44153...
    加来依蓝阅读 7,496评论 3赞 87
  • 写在前面的话: 这篇博客是我从这里“转载”的,为什么转载两个字加“”呢?因为这绝不是简单的复制粘贴,我花了五六个小...
    SmartSean阅读 5,029评论 12赞 45
  • 从哪说起呢? 单纯讲多线程编程真的不知道从哪下嘴。。 不如我直接引用一个最简单的问题,以这个作为切入点好了 在ma...
    Mr_Baymax阅读 2,969评论 1赞 17

友情链接更多精彩内容