• Java交替打印两个字符串


    一、使用volatile关键字

    public class Main {
    volatile int x = 0;
    
    Main() {
        new Thread(() -> {
            while (x < 100) {
                while (x % 2 == 0) ;
                System.out.print("A");
                x++;
            }
        }).start();
        new Thread(() -> {
            while (x < 100) {
                while (x % 2 == 1) ;
                System.out.print("B");
                x++;
            }
        }).start();
    }
    
    public static void main(String[] args) {
        new Main();
    }
    }
    

    二、使用atomicInteger

    import java.util.concurrent.atomic.AtomicInteger;
    
    public class Main {
    
    Main() {
        final AtomicInteger x = new AtomicInteger(0);
        new Thread(() -> {
            while (x.get() < 100) {
                while (x.get() % 2 == 0) ;
                System.out.print("A");
                x.incrementAndGet();
            }
        }).start();
        new Thread(() -> {
            while (x.get() < 100) {
                while (x.get() % 2 == 1) ;
                System.out.print("B");
                x.incrementAndGet();
            }
        }).start();
    }
    
    public static void main(String[] args) {
        new Main();
    }
    }
    

    三、使用锁

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Main {
    Lock x = new ReentrantLock();
    int index = 0;
    
    Main() {
        new Thread(() -> {
            boolean over = false;
            while (!over) {
                if (index % 2 == 0) {
                    x.lock();
                    if (index % 2 == 0) {
                        System.out.print("A");
                        index++;
                    }
                    over = index > 100;
                    x.unlock();
                }
            }
        }).start();
        new Thread(() -> {
            boolean over = false;
            while (!over) {
                if (index % 2 == 1) {
                    x.lock();
                    if (index % 2 == 1) {
                        System.out.print("B");
                        index++;
                    }
                    over = index > 100;
                    x.unlock();
                }
            }
        }).start();
    }
    
    public static void main(String[] args) {
        new Main();
    }
    }
    

    四、使用synchronized关键字

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Main {
    int index = 0;
    
    Main() {
        new Thread(() -> {
            boolean over = false;
            while (!over) {
                if (index % 2 == 0) {
                    synchronized (this) {
                        if (index % 2 == 0) {
                            System.out.print("A");
                            index++;
                        }
                        over = index > 100;
                    }
                }
            }
        }).start();
        new Thread(() -> {
            boolean over = false;
            while (!over) {
                if (index % 2 == 1) {
                    synchronized (this) {
                        if (index % 2 == 1) {
                            System.out.print("B");
                            index++;
                        }
                        over = index > 100;
                    }
                }
            }
        }).start();
    }
    
    public static void main(String[] args) {
        new Main();
    }
    }
    

    五、使用Python

    JavaScript是单线程的,Python可以实现多线程,但是Python的多线程不能充分利用多核。
    这就相当于Python天生就不需要volatile。

    a = "床前明月光疑是地上霜"
    from threading import Thread
    
    index = 0
    
    
    def one():
        global index
        while index < len(a):
            while index % 2 == 0:
                pass
            if index >= len(a): break
            print(a[index])
            index += 1
    
    
    def two():
        global index
        while index < len(a):
            while index % 2 == 1:
                pass
            if index >= len(a): break
            print(a[index])
            index += 1
    
    
    Thread(target=one).start()
    Thread(target=two).start()
    
    
  • 相关阅读:
    LINUX查看硬件配置命令
    jmeter录制对于ip代理会失效
    性能测试常用指标
    jmeter使用jdbc获取注册验证码进行注册
    jmeter测试文件上传功能
    JMeter 功能挖掘之 WEB 文件导出
    分别用C/C++实现栈
    javascript的倒计时功能中newData().getTime()在iOS下会报错问题解决
    jquery解决file上传图片+图片预览
    使用SetInterval时函数不能传参问题
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/9511289.html
Copyright © 2020-2023  润新知