zoukankan      html  css  js  c++  java
  • java多线程编程核心技术学习-1

    实现多线程的两种方式

    继承Thread类,重写Thread类中的run方法

    public class MyThread extends Thread{    
        @Override
        public void run(){
            super.run();
            System.out.println("this is myThread run");
        }
    }
    View Code
    public static void main(String[] args) {    
        Thread myThread=new MyThread();
        myThread.start();
        System.out.println("mian function is over");
    }
    View Code

    注意:代码的顺序并不是线程的执行顺序,start的顺序也不是多个线程的执行顺序。

    实现Runable接口

    java是单继承的,一个子类只能去继承一个父类,所以如果线程类已经继承了其他父类,那么就不能采用继承thread类来实现多线程了

    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("this is myrunable running");
        }
    }
    public class Test {
        public static void main(String[] args) {        
            Runnable myRunnable=new MyRunnable();
            Thread thread=new Thread(myRunnable);
            thread.start();
            System.out.println("main is runing");
        }
    }

     实例变量与线程安全

    数据不共享的实例,两个线程中分别创建了两个thread实例,各种都是独立的count

    public class MyThread extends Thread{    
        private int count=5;    
        public MyThread(String name) {
            super();
            this.setName(name);
        }    
        @Override
        public void run(){
            super.run();
            while(count>0){
                count--;
                System.out.println(this.currentThread().getName());
                System.out.println(count);
            }
        }
    }
    public class Test {
        public static void main(String[] args) {            
            Thread thread1=new MyThread("A");
            Thread thread2=new MyThread("B");
            thread1.start();
            thread2.start();    
        }
    }

     数据共享的实例

    public class MyThread extends Thread {
        private int count = 5;
        @Override
        public void run() {
            super.run();
            count--;
            System.out.println(this.currentThread().getName()+count);
        }
    }
    View Code
    public class Test {
        public static void main(String[] args) {            
            Thread thread=new MyThread();
            
            Thread thread1=new Thread(thread, "A");
            Thread thread2=new Thread(thread,"B");
            Thread thread3=new Thread(thread, "C");
            thread1.start();
            thread2.start();
            thread3.start();
        }
    }
    View Code

     可以在方法上加同步锁,syschronized,这样每一个线程在执行这个方法前需要先尝试去获取这把锁,获取不到就会等待,一直到获取到。

    public class MyThread extends Thread {
        private int count = 5;
        @Override
        synchronized public void run() {
            super.run();
            count--;
            System.out.println(this.currentThread().getName()+count);
        }
    }

     下面是一个多线程非安全对的共享变量实例:

    在实例中共享了静态变量usanameRef和passwordRef

    public class Alogin extends Thread{
        @Override
        public void run(){
            LoginServlet.doPost("a", "aa");
        }
    }
    public class Blogin extends Thread{    
        @Override
        public void run(){
            LoginServlet.doPost("b", "bb");
        }
    }
    public class LoginServlet {
        private static String usenameRef;
        private static String passwordRef;
      synchronized public static void doPost(String usename,String password){
            try {
                usenameRef=usename;
                
                if(usename.equals("a")){
                    Thread.sleep(2000);
                }
                passwordRef=password;
                System.out.println("username="+usenameRef+"password="+password);            
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public class Test {
        public static void main(String[] args) {                
            Alogin alogin=new Alogin();
            alogin.start();
            Blogin blogin=new Blogin();
            blogin.start();
        }
    }

    参考: 《java多线程编程核心技术》

                 https://blog.csdn.net/iaiti/article/details/53314149

  • 相关阅读:
    程序员创业必读的几本书
    新手上路—Java的"瑞士军刀"
    小团队互联网创业记
    Coder必须自废的两样神功
    码界新手,如何更高效的解决问题
    【转载】FckEditor 2.6.3 for Java 2.4 配置
    struts2上传多文件(b)
    Java基础-Java中的Calendar和Date类
    JAVA加减日期
    Java程序员应该了解的10个面向对象设计原则
  • 原文地址:https://www.cnblogs.com/yanliang12138/p/10138013.html
Copyright © 2011-2022 走看看