今天看到了一道题:
三个线程分别打印A,B,C,要求这三个线程一起运行,打印n次,输出形如“ABCABCABC....”的字符串
由于本人没有开发过关于多线程的项目,所以对线程的了解,更多的偏向于网络资料以及个人理解!
以我的角度来说,线程排序打印,三种方式:
1、用join方法,强行让线程加入运行行列:

Thread t1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("A");
                } catch (Exception e) {
                     e.printStackTrace();
                }
                
            }
        });
         Thread t2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("B");
                } catch (Exception e) {
                     e.printStackTrace();
                }
                
            }
        });
         
         Thread t3 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("C");
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        });
         t1.start();
         t1.join();
         t2.start();
         t2.join();
         t3.start();
         t3.join();

2、借于https://blog.csdn.net/zy90101...,concurrent包里面有个CountDownLatch计数器,这里面有2个方法:c.countDown():作用是计数器减1,c1.await(),如果计数器暂时没有到0,则阻塞线程。

    CountDownLatch c1 = new CountDownLatch(1);
    CountDownLatch c2 = new CountDownLatch(1);
    CountDownLatch call = new CountDownLatch(3);
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                c2.await();
                System.out.println("A");
                call.countDown();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                c1.await();
                System.out.println("B");
                c2.countDown();
                call.countDown();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    });
    Thread t3 = new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("C");
            c1.countDown();
            call.countDown();
        }
    });
    t1.start();
    t2.start();
    t3.start();
    try {
        call.await();
    }catch (Exception e){
        e.printStackTrace();
    }

3、用线程池:

static ExecutorService executors =           Executors.newSingleThreadExecutor();
public static void main(String[] args){
         Thread t1 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("A");
                } catch (Exception e) {
                     e.printStackTrace();
                }
                
            }
        });
         Thread t2 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("B");
                } catch (Exception e) {
                     e.printStackTrace();
                }
                
            }
        });
         
         Thread t3 = new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    System.out.print("C");
                } catch (Exception e) {
                    // TODO: handle exception
                }
                
            }
        });
         for (int i = 0; i < 10; i++) {
             executors.submit(new Thread(t1));
             executors.submit(new Thread(t2));
             executors.submit(new Thread(t3));
        }
             
             executors.shutdown();

总结:不做循环打印的话,三种都可以实现!唯独第三种实现了循环打印,我实力有限,而且借此机会对线程的运用多了一些理解!只是个人记录,做备忘用而已


卿言何故
1 声望0 粉丝

枯燥的生活里要多微笑