多线程

作者: 2c0242b7b837 | 来源:发表于2017-01-10 21:17 被阅读49次
    1. 什么是并发并行?
    • 并发:就是两个或者多个事件在同一时刻上发生。
    • 并行:就是两个或者多个事件在同一时间段内发生。
    1. 在java程序进程中至少包含两条线程,一条主线程和一条垃圾回收线程。
    2. 在java程序中开启线程的方式有两种:
    • 使用runtime类的exec方法:
    Runtime runtime = Runtime.getRuntime();           runtime.exec("word");
    
    • processBuilder 的start方法(1.5以后的,建议使用这个来开启一个 新的进程)
    ProcessBuilder pb = new ProcessBuilder("word");          pb.start();
    
    1. 创建多线程的形式:
    • 通过继承Thread类
     class MusicThread extends java.lang.Thread {    
      @Override      
    public void run() {    
          for (int i = 0; i <500 ; i++) {      
            System.out.println("播放音乐"+i);   
           }      }  } 
    

    实现

    for (int i = 0; i <50 ; i++) {          
       System.out.println("dayouxi"+i);    
             if (i == 10){            
         MusicThread ms = new MusicThread();       
              ms.start();        
         }          }  
    
    • 通过实现Runnable接口来创建多线程
    class MusImplementDemo implements java.lang.Runnable{ 
       @Override     public void run() {       
                for (int i = 0; i < 50; i++) {
                System.out.println("听音乐"+i);  
          }     } } 
    

    实现

    for (int i = 0; i <50 ; i++) {   
              System.out.println("dayouxi"+i); 
                if (i == 10){   
                 MusImplementDemo mui = new MusImplementDemo();   
                 Thread th = new Thread(mui);   
                 th.start();   
              }         }  
    
    • 通过匿名内部类创建:
      new Thread(new Runnable() {   
                      @Override
                     public void run() {
                      for (int j = 0; j < 50; j++) {
             System.out.println("播放音乐"+i);
                            }  }   }).start();
    
    1. 继承方式和实现方式的区别:
      • 继承方式:
    2. java中是单继承,如果继承了Thread该类就不能在继承其他的类了。
    3. 从操作上分析,继承方式更简单,获取线程名称也简单。
    4. 从多线程共享一个资源的时候,继承不能做到。 - 接口实现方式:
    5. java中的类可以多实现接口(设计上更加优雅)
    6. 从操作上比继承稍微复杂一点,获取线程的名字也稍微复杂一点,使用Thread类中的currentThread()方法。
    7. 从多线程共享一个资源的时候,实现接口可以做到。
    8. 解决多线程并发访问同一个资源的安全性问题: - 同步代码块 + java程序运行可使用任何对象作为作为同步监听的对象,但是一般我们把当前并发的共同资源作为同步监听的对象。 * 注意在任何时候最多允许一个线程持有同步锁,谁能拿到锁谁就能执行代码块内部程序。
     synchronized (this) {
           if (num > 0) {
     System.out.println(Thread.currentThread().getName() + "吃了" + num + "评估");              //模拟网络延迟
                 try {  
               Thread.sleep(10);   
             } catch (InterruptedException e) { 
                  e.printStackTrace();  
           }  
           num--; 
       }
    
    • 同步方法:就是使用了synchronized修饰的方法
      1. 同步锁是谁?
        • 对于非static方法同步锁就是this。
        • 对于static方法,我们使用当前方法所在的类的字节码对象(AppleDemo2.class)
      2. 不要使用synchronized修饰run方法,修饰后某个线程执行完了所有功能,就像是多个线程出现串行。
        • 解决方案:把需要同步的操作代码定义在一个新的方法中,并且该方法使用synchronized修饰,然后在run方法中调用这个方法。

    class AppleDemo1 implements Runnable{
    private int num = 500;
    @Override
    public void run() {
    for (int i = 0; i < 500; i++) {
    runThrea();
    }
    }
    synchronized private void runThrea() {
    if (num > 0){
    System.out.println(Thread.currentThread().getName() + "吃了" + num + "评估");
    //模拟网络延迟
    try {
    Thread.sleep(10);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    num--;
    }
    }
    }

      - 锁机制  
    

    class AppleDemo3 implements Runnable{
    //创建锁 Lock lock = new ReentrantLock();
    private int num = 500;
    @Override
    public void run() {
    for (int i = 0; i < 500; i++) {
    lockAdd();
    }
    }
    private void lockAdd(){
    //加锁
    lock.lock();
    try {
    if (num > 0) {
    System.out.println(Thread.currentThread().getName() + "吃了" + num + "评估");
    //模拟网络延时
    Thread.sleep(10);
    num--;
    }
    } catch (InterruptedException e) {
    e.printStackTrace();
    } finally {
    //开锁
    lock.unlock();
    }
    }
    }

    7. synchronized的好与坏?  - 好处:保证了多线程并发访问时的同步操作,避免线程的安全性问题。  - 坏处: 使用了synchronzised的方法/代码的性能比不用要低一些。8. 对于线程通信要使用Lock机制就要使用Condition接口:  - wait和notify方法只能被同步监听对象调用,但是Lock根本没有了同步锁机制,所以不能调用wait和notify方法。  - 从java5开始    + 使用Lock机制取代Synchronized代码块和Synchronzied方法。    + 使用Condition接口对象的await,signal方法来取代Object类中的wait,notify方法。

    相关文章

      网友评论

          本文标题:多线程

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