zoukankan      html  css  js  c++  java
  • Java多线程加强

    一、传统多线程

    public void start()

    Causes this thread to begin execution; the Java Virtual Machine calls the run method of this thread.It is never legal to start a thread more than once。

    public void run()

    If this thread was constructed using a separate Runnable run object, then that Runnable object's run method is called; otherwise, this method does nothing and returns. Subclasses of Thread should override this method.

     /* What will be run. */
    private Runnable target; 
    public void run() {
           if (target != null) {
               target.run();
           }
     }

    public Thread(Runnable target) {
         init(null, target, "Thread-" + nextThreadNum(), 0);
     }

    创建线程的两种方式:

    //1.创建线程的方式一
            Thread thread1 = new Thread(){
                @Override
                public void run() {
                    while(true){
                        System.out.println(Thread.currentThread().getName());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            };
            thread1.start();
            //2.创建线程的方式二
            Thread thread2 = new Thread(new Runnable(){//更加体现面向对象的思想,将线程需要运行的代码装在一个Runnable对象中。
                @Override
                public void run() {
                    while(true){
                        System.out.println(Thread.currentThread().getName());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }});
            thread2.start();

    思考:

    new Thread(new Runnable(){ //如果Thread的子类没有覆盖run方法,则会调用父类的run方法,父类的run方法会调用target对象的run方法
                @Override
                public void run() {
                    while(true){
                        System.out.println("runnable:"+Thread.currentThread().getName());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }){
                public void run() {
                    while(true){
                        System.out.println("thread:"+Thread.currentThread().getName());
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                };
            }.start();

    线程的互斥:(要让互斥访问代码块,要用同一个锁对象)

    线程安全问题可以用银行转账来解释。

        class OutPutter{
            public static synchronized void display1(String msg){//静态方法要同步也需要一个锁对象和它关联,静态方法运行时有个对象和它关联,那么这个对象是什么呢?类的字节码在内存中也是一个对象,静态方法运行时还没有类对象,但类的字节码对象已经在内存中了。
                int len = msg.length();
                for(int i = 0 ; i < len ; i++){
                    System.out.print(msg.charAt(i));
                }
                System.out.println();
            }
            public void display(String msg){
                int len = msg.length();
                synchronized (OutPutter.class) {
                    for(int i = 0 ; i < len ; i++){
                        System.out.print(msg.charAt(i));
                    }
                    System.out.println();
                }
            }
        }
        
  • 相关阅读:
    LeetCode 623. Add One Row to Tree
    LeetCode 894. All Possible Full Binary Trees
    LeetCode 988. Smallest String Starting From Leaf
    LeetCode 979. Distribute Coins in Binary Tree
    LeetCode 814. Binary Tree Pruning
    LeetCode 951. Flip Equivalent Binary Trees
    LeetCode 426. Convert Binary Search Tree to Sorted Doubly Linked List
    LeetCode 889. Construct Binary Tree from Preorder and Postorder Traversal
    LeetCode 687. Longest Univalue Path
    LeetCode 428. Serialize and Deserialize N-ary Tree
  • 原文地址:https://www.cnblogs.com/java-cjt/p/4471794.html
Copyright © 2011-2022 走看看