java多线程简介

  • 线程对象是可以产生线程的对象。比如在Java平台中Thread对象,Runnable对象。线程,是指正在执行的一个指点令序列。在java平台上是指从一个线程对象的start()开始,运行run方法体中的那一段相对独立的过程。相比于多进程,多线程的优势有:
    (1) 进程之间不能共享数据,线程可以;
    (2) 系统创建进程需要为该进程重新分配系统资源,故创建线程代价比较小;
    (3) Java语言内置了多线程功能支持,简化了java多线程编程。

java 创建线程的方式

  1. 继承Thread类创建线程
    • 定义一个继承Thread类的子类,并重写该类的run()方法;
    • 创建Thread子类的实例,即创建了线程对象;
    • 调用该线程对象的start()方法启动线程。
Thread类创建线程的案例
public class Thread_1  {
 public static void main(String args[]){
     Threadtest threadtest=new Threadtest();
     threadtest.start();
 }
}
class  Threadtest extends Thread{
 @Override
 public void run() {
     System.out.println(Thread.currentThread().getName()+"  线程开启");
 }
 }
  1. 实现Runnable接口创建线程类
  • 通过实现Runnable接口创建线程类的具体步骤和具体代码如下:
  • 定义Runnable接口的实现类,并重写该接口的run()方法;
  • 创建Runnable实现类的实例,并以此实例作为Thread的target对象,即该Thread对象才是真正的线程对象。
Runnable类创建线程的实现买票
class Test implements Runnable{
int num=100;
Object object=new Object();
  @Override
  public void run() {
      while (num>0){
          synchronized (object){
              System.out.println(Thread.currentThread().getName()+"   "+num--);
          }
          try {
              Thread.sleep(1);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  }
}
public class Thraed1 {
  public static void  main(String args[]) {
      Test t = new Test();
      Thread thread = new Thread(t);
      Thread thread1 = new Thread(t);
      thread.start();
      thread1.start();
  }
}

线程的生命周期

java 线程中对象传递_就绪状态

  • 新建状态:当刚刚创建Trhread的对象该线程对象就处于新生状态。处于新生状态的线程有自己的内存空间,通过调用start方法进入就绪状态(runnable)。
    注意:不能对已经启动的线程再次调用start()方法,否则会出Java.lang.IllegalThreadStateException异常。
  • 就绪状态:当调用start()时就会进入就绪状态, 处于就绪状态的线程已经具备了运行条件,但还没有分配到CPU,处于线程就绪队列(尽管是采用队列形式,事实上,把它称为可运行池而不是可运行队列。因为cpu的调度不一定是按照先进先出的顺序来调度的),等待系统为其分配CPU。等待状态并不是执行状态,当系统选定一个等待执行的Thread对象后,它就会从等待执行状态进入执行状态,系统挑选的动作称之为“cpu调度”。一旦获得CPU,线程就进入运行状态并自动调用自己的run方法。
  • 运行状态:获取到cpu的执行权,但运行状态可以向(就绪,阻塞,死亡)状态转换
    a .向就绪状态转换:如果该线程失去了cpu资源,就会又从运行状态变为就绪状态。重新等待系统分配资源。也可以对在运行状态的线程调用yield()方法,它就会让出cpu资源,再次变为就绪状态。
    b . 向阻塞态转换:
    ①、线程调用sleep方法主动放弃所占用的系统资源
    ②、线程调用一个阻塞式IO方法,在该方法返回之前,该线程被阻塞
    ③、线程试图获得一个同步监视器,但更改同步监视器正被其他线程所持有
    ④、线程在等待某个通知(notify)
    ⑤、程序调用了线程的suspend方法将线程挂起。不过该方法容易导致死锁,所以程序应该尽量避免使用该方法。
    c. 向死亡状态转换:当线程的run()方法执行完,或者被强制性地终止,例如出现异常,或者调用了stop()、desyory()方法等等,就会从运行状态转变为死亡状态。
  • 阻塞状态:处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入阻塞状态。
    在阻塞状态的线程不能进入就绪队列。只有当引起阻塞的原因消除时,如睡眠时间已到,或等待的I/O设备空闲下来,线程便转入就绪状态,重新到就绪队列中排队等待,被系统选中后从原来停止的位置开始继续运行。有三种方法可以暂停Threads执行:
  • 死亡状态: 当线程的run()方法执行完,或者被强制性地终止,就认为它死去。这个线程对象也许是活的,但是,它已经不是一个单独执行的线程。线程一旦死亡,就不能复生。
    如果在一个死去的线程上调用start()方法,会抛出java.lang.IllegalThreadStateException异常。