zoukankan      html  css  js  c++  java
  • 多线程交替输出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

  • 相关阅读:
    对接某款商城系统[5]商城商品多级价格处理
    利用DelegatingHandler实现Web Api 的Api key校验
    采用Lambda表达式快速实现实体模型对象转换到DTO
    驱蚊器翁
    批量测试网络关系的小脚本
    jboss7访问日志功能及使用goaccess工具分析
    jetty使用jndi数据源
    sping junit test
    Too many open files解决方案及原理
    jboss7的JAX-WS客户端
  • 原文地址:https://www.cnblogs.com/wujf/p/9431451.html
Copyright © 2011-2022 走看看