Java多线程1

作者: 香沙小熊 | 来源:发表于2018-11-26 18:46 被阅读3次

    创建多线程的3种方式

    1、继承Thread类实现多线程
            Thread thread = new Thread() {
                @Override
                public void run() {
                    super.run();
                    while (true) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("1:" + Thread.currentThread().getName());
                        System.out.println("2:" + this.getName());
                    }
                }
            };
            thread.start();
    
    2、实现Runnable接口方式实现多线程
    Thread thread1 = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        try {
                            Thread.sleep(500);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        System.out.println("3:" + Thread.currentThread().getName());
                    }
                }
            });
            thread1.start();
    

    定时器

    import java.util.Timer;
    import java.util.TimerTask;
    
    public class TraditionalTimerTest {
        public static void main(String[] args) {
    
    //         new Timer().schedule(new TimerTask() {
    //             @Override
    //             public void run() {
    //
    //                 System.out.println("bombing!");
    //             }
    //         },10000);
    
            class MyTimberTask extends TimerTask {
                @Override
                public void run() {
    
                    System.out.println("bombing!");
                    new Timer().schedule(new MyTimberTask(), 2000);
                }
            }
    
    
            new Timer().schedule(new MyTimberTask(), 2000);
    
    
            int count = 0;
            while (true) {
                System.out.println(count++);
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
            }
        }
    }
    
    0
    1
    bombing!
    2
    3
    bombing!
    4
    5
    bombing!
    6
    省略...
    

    线程的互斥与同步通信

    public class TraditionalThreadSynchronized {
    
        public static void main(String[] args) {
    
            new TraditionalThreadSynchronized().init();
        }
    
        private void init() {
            final Outputer outputer = new Outputer();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    while (true) {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        outputer.output("kpioneer");
    
                    }
                }
            }).start();
    
    //        new Thread(new Runnable() {
    //            @Override
    //            public void run() {
    //
    //                while (true) {
    //                    try {
    //                        Thread.sleep(10);
    //                    } catch (InterruptedException e) {
    //                        e.printStackTrace();
    //                    }
    //                    outputer.output2("Tom");
    //
    //                }
    //            }
    //        }).start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
    
                    while (true) {
                        try {
                            Thread.sleep(10);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        outputer.output3("Jack");
    
                    }
                }
            }).start();
        }
    
      static   class Outputer {
    
            public void output(String name) {
    
                int len = name.length();
    
                synchronized (Outputer.class) {
    
                    for (int i = 0; i < len; i++) {
                        System.out.print(name.charAt(i));
                    }
                    System.out.println();
                }
    
            }
    
            public synchronized void output2(String name) {
                int len = name.length();
    
                for (int i = 0; i < len; i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            }
    
          public static synchronized void output3(String name) {
              int len = name.length();
    
              for (int i = 0; i < len; i++) {
                  System.out.print(name.charAt(i));
              }
              System.out.println();
          }
        }
    }
    

    线程同步通信技术

    子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程有循环100,如此循环50次,请写出程序。

    public class TraditionalThreadCommunication {
        public static void main(String[] args) {
    
            final Business business = new Business();
            new Thread(new Runnable() {
                        @Override
                        public void run() {
                            for (int i = 1; i <= 50; i++) {
                                business.sub(i);
                            }
                        }
                    }
            ).start();
            for (int i = 1; i <= 50; i++) {
                business.main(i);
            }
        }
    
    }
    
    /**
     *要用到共同数据(包括同步锁)的若干方法应该归在同一个类身上,
     * 这种设计正好体现了高类聚和和程序的健壮性
     */
    class Business {
        private boolean bShouldSub = true;
        public synchronized void sub(int i) {
            if(!bShouldSub) {
    
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int j = 1; j <= 10; j++) {
                System.out.println("sub thread sequece of " + j + ",loop of " + i);
    
            }
            bShouldSub = false;
            this.notify();
        }
    
        public synchronized void main(int i) {
            if(bShouldSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int j = 1; j <=100; j++) {
                System.out.println("main thread sequece of " + j + ",loop of " + i);
    
            }
            bShouldSub = true;
            this.notify();
        }
    }
    
    sub thread sequece of 1,loop of 1
    sub thread sequece of 2,loop of 1
    sub thread sequece of 3,loop of 1
    sub thread sequece of 4,loop of 1
    sub thread sequece of 5,loop of 1
    sub thread sequece of 6,loop of 1
    sub thread sequece of 7,loop of 1
    sub thread sequece of 8,loop of 1
    sub thread sequece of 9,loop of 1
    sub thread sequece of 10,loop of 1
    main thread sequece of 1,loop of 1
    main thread sequece of 2,loop of 1
    main thread sequece of 3,loop of 1
    main thread sequece of 4,loop of 1
    main thread sequece of 5,loop of 1
    main thread sequece of 6,loop of 1
    main thread sequece of 7,loop of 1
    main thread sequece of 8,loop of 1
    main thread sequece of 9,loop of 1
    main thread sequece of 10,loop of 1
    main thread sequece of 11,loop of 1
    省略中间...
    main thread sequece of 99,loop of 1
    main thread sequece of 100,loop of 1
    sub thread sequece of 1,loop of 2
    sub thread sequece of 2,loop of 2
    sub thread sequece of 3,loop of 2
    sub thread sequece of 4,loop of 2
    sub thread sequece of 5,loop of 2
    sub thread sequece of 6,loop of 2
    sub thread sequece of 7,loop of 2
    sub thread sequece of 8,loop of 2
    sub thread sequece of 9,loop of 2
    sub thread sequece of 10,loop of 2
    main thread sequece of 1,loop of 2
    main thread sequece of 2,loop of 2
    main thread sequece of 3,loop of 2
    省略...
    

    相关文章

      网友评论

        本文标题:Java多线程1

        本文链接:https://www.haomeiwen.com/subject/vreyqqtx.html