线程浅析

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程浅析相关的知识,希望对你有一定的参考价值。

1.进程与线程

   一个进程包含多个线程。可以把进程当做一个应用程序。

   操作系统分配一段时间给一个进程,让CPU执行该进程。进程再将时间片段分割给各个线程

2.创建线程(Thread)的方法

//方法一
Thread thread = new Thread(){
       @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();      //要写的代码
    } 
};//创建Thread类,重写run方法
thread.start()  //开启线程

 

//方法二
public class test {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        NewThread nt = new NewThread();
        Thread thread = new Thread(nt);//将该类放入Thread类中
        thread.start();//启动线程
    }
}

class NewThread implements Runnable{//创建一个继承Runnable接口的类

    @Override
    public void run() {
        // TODO Auto-generated method stub
        //要写的代码
    }
    
}

注:所以说Thread类自身继承了Runnable();

3.线程的生命周期

图解

技术分享

理解: 线程具有7种状态

         出生:在Thread运用start()方法之前都算出生状态                                         就绪:当start()方法完成之后线程处于就绪状态(等待执行)

         运行:操作系统分配时间,让线程进入cpu运行                                             

         产生阻塞的三种方法(也是三种状态):

         等待:利用thread1.wait()线程自动进入阻塞状态。

                 一种设置时常:thread1.wait(1000);//当过了1000毫秒后自动处于就绪状态

                 另一种不设市场:只能够其他线程利用thread1.notify()唤醒,否则将一直处于阻塞状态。

         睡眠:利用thread.sleep()进入睡眠状态。

                 必须设置时长,当时间过了自动进入就绪状态

         阻塞:当线程处于等待I/O的输入输出方可再次运行时,处于阻塞状态。等到输入输出完毕时候自动进入就绪状态。

         最后

         线程运行完之后处于死亡状态

4.线程的优先级

    优先级高的线程先运行,低的后运行。

thread.setPriority(int rank);//设置优先级

thread.yield()//让比自己高优先级的线程先运行

5.其他主要方法

//join()方法 Thread thread1 = new Thread(){
   public void run (){
        thread2.join();  //thread2调用了join方法
   }  
};

Thread thread2 = new Thread(){
    public void run (){
        //
   }  
}
//所以thread1要等待thread2执行完毕才能执行

6.线程同步  

  1.什么叫线程同步,为什么需要线程同步

     当多个线程同时修改或调用同一个资源的时候,可能会导致数据不一致的情况,为了防止这种情况。就需要当一个线程使用资源的时候,另一个线程需要等待前一个线程使用完成。

  2.线程锁

     将资源对象锁住,防止其他线程使用。

//方法一
Thread thread = new Thread(){
       @Override
    public void run() {
        // TODO Auto-generated method stub
       super.run();
    synchronized(){
           //锁住资源对象
      }
    }
} 
//方法二
Thread thread = new Thread(){
       @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        use();
    }

    private synchronized  void use(){
       //锁住资源对象
    }  
} 
//所以说synchronized是一个修饰符

     

 7.小技巧

    1.如何控制线程死亡:

boolean isDead = true;

Thread thread = new Thread(){
       @Override
    public void run() {
        // TODO Auto-generated method stub
       super.run();
       while(isDead){
          if (...){
             //... 
          }
          else{
            isDead = false;
          }
       }    
    }
}        

 

以上是关于线程浅析的主要内容,如果未能解决你的问题,请参考以下文章

浅析进程与线程之间的区别

浅析进程与线程之间的区别

浅析进程与线程之间的区别

mysql线程池的实现原理浅析

浅析多线程的对象锁和Class锁

线程池源码浅析