JAVA多线程

Thread与Runnable区别

  • 首先,根据源码可以知道Thread实现了Runnable接口,在执行多线程主体之前,他还干了一些其他的事情,比如说分配CPU资源,检查线程是否启动等事情,然后再执行线程主题。
  • Runnable适合多个相同程序代码的线程去处理同一个资源,比如买票程序。
  • Runnable接口可以避免JAVA单继承的局限。
  • Runnable增加了程序的健壮性,代码能够被多个线程所共享,数据和代码是独立的。

线程调用Start()方法不会立刻启动,而是处于就绪状态。等待CPU调度以后才可以。

多线程操作

  • isAlive()
  • Thread.currentThread.getName()
  • join() :线程强制运行
  • Thread.sleep(): 线程休眠
  • 线程中断:interrupt(),在其他线程中调用t.interrupt(),t线程被中断
  • setDaemon(), 设置后台线程,这样可以在主线程结束的时候它依然在运行
  • 优先级:setPriority();主方法优先级是NORM
  • 线程礼让:yield()

同步与死锁

资源共享时需要同步,过多同步容易产生死锁。

  • 同步代码块:synchronized(this){}
    class MyThread implements Runnable{
      private int ticket = 5 ;    // 假设一共有5张票
      public void run(){
          for(int i=0;i<100;i++){
              synchronized(this){    // 要对当前对象进行同步
                  if(ticket>0){    // 还有票
                      try{
                          Thread.sleep(300) ;    // 加入延迟
                      }catch(InterruptedException e){
                          e.printStackTrace() ;
                      }
                      System.out.println("卖票:ticket = " + ticket-- );
                  }
              }
          }
      }
    };
    public class SyncDemo02{
      public static void main(String args[]){
          MyThread mt = new MyThread() ;    // 定义线程对象
          Thread t1 = new Thread(mt) ;    // 定义Thread对象
          Thread t2 = new Thread(mt) ;    // 定义Thread对象
          Thread t3 = new Thread(mt) ;    // 定义Thread对象
          t1.start() ;
          t2.start() ;
          t3.start() ;
      }
    };
    
  • 同步方法:

    class MyThread implements Runnable{
      private int ticket = 5 ;    // 假设一共有5张票
      public void run(){
          for(int i=0;i<100;i++){
              this.sale() ;    // 调用同步方法
          }
      }
      public synchronized void sale(){    // 声明同步方法
          if(ticket>0){    // 还有票
              try{
                  Thread.sleep(300) ;    // 加入延迟
              }catch(InterruptedException e){
                  e.printStackTrace() ;
              }
              System.out.println("卖票:ticket = " + ticket-- );
          }
    
      }
    };
    public class SyncDemo03{
      public static void main(String args[]){
          MyThread mt = new MyThread() ;    // 定义线程对象
          Thread t1 = new Thread(mt) ;    // 定义Thread对象
          Thread t2 = new Thread(mt) ;    // 定义Thread对象
          Thread t3 = new Thread(mt) ;    // 定义Thread对象
          t1.start() ;
          t2.start() ;
          t3.start() ;
      }
    };
    
  • 程序中过多的同步会产生死锁。

results matching ""

    No results matching ""