• 多线程交替输出1234


    1、synchronized

    package threadT;
    
    public class TestPrint {
        static int i = 1;
    
        public static void main(String[] args) throws Exception {
            final Object obj = new Object();
            Thread t1 = new Thread(new Runnable() {
                public void run() {
                    try {
                        while (true) {
                            synchronized (obj) {
                                Thread.sleep(1000);
                                obj.notifyAll();
                                obj.wait();
                                if (i == 1)
                                    System.out.println(i++ % 3);
                            }
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            Thread t2 = new Thread(new Runnable() {
                public void run() {
                    try {
                        while (true) {
                            synchronized (obj) {
                                Thread.sleep(1000);
                                obj.notifyAll();
                                obj.wait();
                                if (i == 2)
                                    System.out.println(i++ % 3);
                            }
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            Thread t3 = new Thread(new Runnable() {
                public void run() {
                    try {
                        while (true) {
                            synchronized (obj) {
                                Thread.sleep(1000);
                                obj.notifyAll();
                                obj.wait();
                                if (i == 3) {
                                    System.out.println(3);
                                    i = 1;
                                }
                            }
                        }
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            });
            t1.start();
            t2.start();
            t3.start();
        };
    }

    2、ReentrantLock

    package threadT;
    
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class TestPrint {
        private static Lock lock = new ReentrantLock();
        private static int state = 0;
    
        static class First extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.lock();
                    if (state % 4 == 0) {
                        System.out.println("1");
                        state++;
                    }
                    lock.unlock();
                }
            }
        }
    
        static class Second extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.lock();
                    if (state % 4 == 1) {
                        System.out.println("2");
                        state++;
                    }
                    lock.unlock();
                }
            }
        }
    
        static class Third extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.lock();
                    if (state % 4 == 2) {
                        System.out.println("3");
                        state++;
                    }
                    lock.unlock();
                }
            }
        }
    
        static class Forth extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    lock.lock();
                    if (state % 4 == 3) {
                        System.out.println("4");
                        state++;
                    }
                    lock.unlock();
                }
            }
        }
    
        public static void main(String[] args) {
            First first = new First();
            Second second = new Second();
            Third third = new Third();
            Forth forth = new Forth();
            first.start();
            second.start();
            third.start();
            forth.start();
        }
    }

    3、Semaphore

    package threadT;
    
    import java.util.concurrent.Semaphore;
    
    public class TestPrint {
        public static Semaphore sem1;
        public static Semaphore sem2;
        public static Semaphore sem3;
        public static Semaphore sem4;
    
        static class FirstThread extends Thread {
            @Override
            public void run() {
                try {
                    while (true) {
                        Thread.sleep(1000);
                        sem1.acquire();
                        System.out.println("1");
                        sem2.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class SecondThread extends Thread {
            @Override
            public void run() {
                try {
                    while (true) {
                        Thread.sleep(1000);
                        sem2.acquire();
                        System.out.println("2");
                        sem3.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ThirdThread extends Thread {
            @Override
            public void run() {
                try {
                    while (true) {
                        Thread.sleep(1000);
                        sem3.acquire();
                        System.out.println("3");
                        sem4.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        static class ForthThread extends Thread {
            @Override
            public void run() {
                try {
                    while (true) {
                        Thread.sleep(1000);
                        sem4.acquire();
                        System.out.println("4");
                        sem1.release();
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public static void main(String[] args) {
            sem1 = new Semaphore(1);
            sem2 = new Semaphore(1);
            sem3 = new Semaphore(1);
            sem4 = new Semaphore(1);
            try {
                // 不要有sem1.acquire()
                sem2.acquire();
                sem3.acquire();
                sem4.acquire();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            new FirstThread().start();
            new SecondThread().start();
            new ThirdThread().start();
            new ForthThread().start();
    
        }
    }

    4、volatile

    package threadT;
    
    public class TestPrint {
        volatile static int state = 0;
    
        static class First extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (state % 4 == 0) {
                        System.out.println("1");
                        state++;
                    }
                }
            }
        }
    
        static class Second extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (state % 4 == 1) {
                        System.out.println("2");
                        state++;
                    }
                }
            }
        }
    
        static class Third extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (state % 4 == 2) {
                        System.out.println("3");
                        state++;
                    }
                }
            }
        }
    
        static class Forth extends Thread {
            @Override
            public void run() {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    if (state % 4 == 3) {
                        System.out.println("4");
                        state++;
                    }
                }
            }
        }
    
        public static void main(String[] args) {
            First first = new First();
            Second second = new Second();
            Third third = new Third();
            Forth forth = new Forth();
            first.start();
            second.start();
            third.start();
            forth.start();
        }
    }

    有追求,才有动力!

    向每一个软件工程师致敬!

    by wujf

    mail:921252375@qq.com

  • 相关阅读:
    Log4J日志配置详解
    Linux:ssh端口转发详解
    Android数据存储五种方式总结
    Nginx学习记录
    简单通用JDBC辅助类封装
    PBR.理论
    PBR.工作流贴图
    不设置readable,读取图片数据
    直接打开指定的目录
    Compute Shader基础
  • 原文地址:https://www.cnblogs.com/wujf/p/9431451.html
Copyright © 2020-2023  润新知