• 多线程编程解决思路


    场景一,多个线程要求按照指定的顺序执行, 如现在有A、B、C 3个线程,要求按照A->B->C的顺序来依次执行。

    解决思路: A B C 线程需要共享一个标志位,依据标志位来决定A B C是该立即执行还是该阻塞或者是等待或者是让出时间片。

    方案1, 用AtomicInteger作为标识位, 用该变量对线程数(3)取模,如果非特定值,则让当前线程让出CPU时间片。否则执行业务逻辑并对标识位进行更新。

    public class SeqPrint {
        private int n;
    
    
        public SeqPrint(int n) {
            this.n = n;
        }
    
        AtomicLong idx = new AtomicLong(0L);
        public void foo() throws InterruptedException {
            for (int i = 0; i < n; i++) {
                while (idx.get() % 2 != 0) {
                    Thread.yield();
                }
                System.out.print("foo");
                idx.getAndIncrement();
            }
        }
    
        public void bar() throws InterruptedException {
            for (int i = 0; i < n; i++) {
                while (idx.get() % 2 == 0) {
                    Thread.yield();
                }
                System.out.print("bar");
                idx.getAndIncrement();
            }
        }
       public static void main(String[] args) throws InterruptedException {
            final SeqPrint seqPrint = new SeqPrint(10);
    
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        seqPrint.foo();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        seqPrint.bar();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
    
            t2.start();
            t1.start();
        }
    }
    
    

    VGhpcyBpcyBhIHByb2dyYW1taW5nIHRlc3QgYXNzaWdubWVudCBmb3IgY2FuZGlkYXRlcy4NCllvdSBtdXN0IHdvcmsgb24geW91ciBvd24sIGFuZCBzdWJtaXQgeW91ciB3b3JrIHdpdGhpbiAzIGRheXMuIFRoZSB3aG9sZSBzb2x1dGlvbiBtdXN0IGJlIHlvdXIgb3JpZ2luYWwgd29yay4NCklmIHRoZXJlIGlzIGFueXRoaW5nIHVuY2xlYXIgdG8geW91IGFuZCBpcyBub3QgbWVudGlvbmVkIGluIHRoZSBhc3NpZ25tZW50LCB5b3UgY2FuIG1ha2UgeW91ciBvd24gcmVhc29uYWJsZQ0KYXNzdW1wdGlvbiBhbmQgY29tcGxldGUgeW91ciB3b3JrLg0KWW91IGNhbiBtZW50aW9uIHlvdXIgYXNzdW1wdGlvbiBpbiB0aGUgUkVBRE1FLm1kIGZpbGUuDQpZb3Ugc2hvdWxkIHByb3ZpZGUgYSBSRUFETUUubWQgd2l0aCBpbnN0cnVjdGlvbnMgdG8gZXhlY3V0ZSB0aGUgc29sdXRpb24gYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24gb24gdGhlDQpkZWNpc2lvbnMgbWFkZSBmb3IgdGhlIHNvbHV0aW9uLg0KV2hhdCB3ZSBhcmUgbG9va2luZyBmb3I6DQoqIEZ1bmN0aW9uYWwgY29ycmVjdG5lc3MgKFRoZSBzb2x1dGlvbiB3b3JrcykNCiogVXNhZ2Ugb2YgSmF2YSBTdHJlYW0gQVBJIChqYXZhLnV0aWwuc3RyZWFtKSAoanVzdCB0byBjbGVhciBhbnkgZG91YnQgdGhhdCB3ZSBkb24ndCB3YW50IEthZmthIFN0cmVhbSkNCiogRXhwYW5kYWJpbGl0eSBvZiB0aGUgZGVzaWduDQoqIFRoZSBzdWJtaXR0ZWQgY29kZSBpcyB0ZXN0ZWQsIHdpdGggdGVzdCBzdGVwcyBhbmQgdGVzdCByZXN1bHQgaW5jbHVkZWQgaW4gdGhlIFJFQURNRS5tZCBmaWxlDQpTdG9yeQ0KQXMgYSBzZWN1cml0aWVzIHNldHRsZW1lbnQgY29tcGFueSBpbiBhIHNpbXBsZSBtYXJrZXQsDQpJIHdhbnQgdG8gcmVhZCB0aGUgdHJhZGUgcmVjb3JkcyBmcm9tIGN1c3RvbWVyIGFuZCBjYXB0dXJlIGFuZCBlbnJpY2ggdGhlIHRyYWRlIGRldGFpbHMsDQpzbyB0aGF0IHRoZSB0cmFkZXMgY2FuIGJlIHNlbnQgdG8gb3RoZXIgZG93bnN0cmVhbSBzZXJ2aWNlcyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLg0KQWNjZXB0YW5jZSBDcml0ZXJpYQ0KKiBUcmFkZSBDYXB0dXJlIFNlcnZpY2U6DQoqIE1vbml0b3IgYW5kIHJlYWQgdGV4dCBmaWxlcyBjb250YWluaW5nIGFuIGFycmF5IG9mIEpTT04gb2JqZWN0cyAoZS5nLiB0cmFkZSByZWNvcmRzKSBpbiBhIHNwZWNpZmljDQpsb2NhdGlvbg0KKiBSZWFkIHRoZSBKU09OIG9iamVjdHMgaW5zaWRlIHRoZSBmaWxlIGFuZCB0cmFuc2Zvcm0gdGhlbSBpbnRvIGFub3RoZXIgSlNPTiBkYXRhIGZvcm1hdCAoc2VlIGV4YW1wbGUNCmJlbG93KQ0KKiBQdWJsaXNoIHRoZSBKU09OIG9iamVjdHMgdG8gYSBLYWZrYSB0b3BpYyBmb3IgZG93bnN0cmVhbSBzZXJ2aWNlcw0KKiBEb3duc3RyZWFtIEZlZWQgU2VydmljZSAxOg0KKiBFdmVyeSA1IG1pbnV0ZSwgcmVhZCB0aGUgZGF0YSBmcm9tIHRoZSBLYWZrYSB0b3BpYywgb3V0cHV0IHRoZSBkYXRhIGludG8gYSBuZXcgdGV4dCBmaWxlIGluIGEgc3BlY2lmaWMNCmxvY2F0aW9uIGZvciBzZXJ2aWNlIEENCiogRG93bnN0cmVhbSBGZWVkIFNlcnZpY2UgMjoNCiogRXZlcnkgMSBtaW51dGUsIHJlYWQgdGhlIGRhdGEgZnJvbSB0aGUgS2Fma2EgdG9waWMsIG91dHB1dCB0aGUgZGF0YSBpbnRvIEFOT1RIRVIgbmV3IHRleHQgZmlsZSBpbg0KQU5PVEhFUiBzcGVjaWZpYyBsb2NhdGlvbiBmb3Igc2VydmljZSBCDQpFeGFtcGxlIG9mIGlucHV0IGZpbGU6DQpbDQp7DQoidHJhZGVSZWZlcmVuY2UiIDogIlQwMDAwMSIgLA0KImFjY291bnROdW1iZXIiIDogIjEzMDAyMTgyNzciICwNCiJzdG9ja0NvZGUiIDogIktPIiAsDQoicXVhbnRpdHkiIDogIjI4OC4xMjAwMDAiICwNCiJjdXJyZW5jeSIgOiAiVVNEIiAsDQoicHJpY2UiIDogIjEyMzQuNTYiICwNCiJicm9rZXIiIDogIkIwMDEyMyINCn0gLA0Kew0KLi4uIChhbm90aGVyIEpTT04gcmVjb3JkKQ0KfSAsDQouLi4gKG1vcmUgSlNPTiByZWNvcmRzKQ0KXQ0KRXhhbXBsZSBvZiBvdXRwdXQgZmlsZToNCk5vdGU6IEFtb3VudCA9IFByaWNlICogUXVhbnRpdHkgKHJvdW5kIHVwKS4gUmVjZWl2ZWQgdGltZXN0YW1wIGlzIHNlcnZlciB0aW1lIGluIFVUQyBvZmZzZXQuDQpbDQp7DQoidHJhZGVSZWZlcmVuY2UiIDogIlQwMDAwMSIgLA0KImFjY291bnROdW1iZXIiIDogIjEzMDAyMTgyNzciICwNCiJzdG9ja0NvZGUiIDogIktPIiAsDQoicXVhbnRpdHkiIDogIjI4OC4xMjAwMDAiICwNCiJjdXJyZW5jeSIgOiAiVVNEIiAsDQoicHJpY2UiIDogIjEyMzQuNTYiICwNCiJicm9rZXIiIDogIkIwMDEyMyIgLA0KImFtb3VudCIgOiAiMzU1NzAxLjQzIiAsDQoicmVjZWl2ZWRUaW1lc3RhbXAiIDogIjIwMTktMDEtMDFUMDg6MDA6MDEuMTIwMDAwIg0KfSAsDQp7DQouLi4gKGFub3RoZXIgSlNPTiByZWNvcmQpDQp9ICwNCi4uLiAobW9yZSBKU09OIHJlY29yZHMpDQpdDQo=

    言之有物
  • 相关阅读:
    ofbiz初级教程
    IBASE4J开发环境搭建
    Nginx在windows上安装 及 Nginx的配置及优化
    Windows里正确安装Zookeeper以服务运行
    分享一个完整的Mybatis分页解决方案
    jquery weui ajax滚动加载更多
    Spring+Mybatis+SpringMVC后台与前台分页展示实例
    Mysql怎么样避免全表扫描,sql查询优化
    SQL优化|Java面试题
    mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)
  • 原文地址:https://www.cnblogs.com/Pikzas/p/14441899.html
Copyright © 2020-2023  润新知