线程的概述

过程: 计算机中特定性能的程序在数据集上的一次运行

线程: 计算机过程的一个单元

多线程: 一个过程有多个线程在同时运行

jvm: jvm是多线程的,在咱们运行jvm的时候后盾会运行垃圾回收的线程,来清理没有被援用的对象

过程与线程的区别:

过程之间相互隔离,不共享数据

同一个过程的线程之间能够共享数据

线程的实现

创立新执行线程有两种办法

一种办法是将类申明为Thread的子类.该子类应重写Thread类的run办法.接下来能够调配并启动该子类的实例.

线程启动的时候应用线程的start办法而不是run

继承Thread类

1.子类重写父类中的run办法,将线程运行的代码寄存在run中,即:线程体

2.建设子类对象的同时线程也被创立

3.通过调用start办法开启线程

class MyThread extends Thread{

public void run(){

// 业务逻辑 , 线程体

}

}

public class ThreadDemo{

public static void main(String[] args){

new MyThread().start();

new MyThread().start();

}

}

另一种办法是申明实现Runnable接口的类.该类而后实现run办法,而后能够调配该类的实例,在创立Thread时作为一个参数来传递并启动.

实现 Runnable 接口

  1. 自定义类实现接口中的 run 办法。
  2. 通过 Thread 类创立线程,并将实现了 Runnable 接口的子类对象作为参数传递给 Thread 类的构造方法

3.Thread 类对象调用 start 办法开启线程

class MyThread implements Runnable{

public void run(){

// 业务逻辑 , 线程体

}

}

pulbic class ThreadDemo{

public static void main(String[] args){

MyThread t1 = new MyThread();

new Thread(t1).start();

new Thread(t1).start();

}

}

线程根本罕用操作

获取线程名字: getName()

获取main办法所在线程名字:Thread.currentThread().getName()

设置线程名字: 对象.setname()

设置优先级: 对象.setPriority()

线程的退出: 对象.join() //执行完之后,再执行其余过程

线程的谦让: Thread.yield()

线程的管制: 对象.setDaemon(boolean on)

线程的终止: 对象.stop() //已过期

对象.interrupt() //举荐应用

线程执行原理

线程的并发执行是通过多个线程一直的切换CPU的资源,这个速度是十分快的,咱们感觉不到,咱们能感知到的是多个线程在并发的执行.

线程的生命周期

新建: 线程被 new进去

准备就绪: 线程具备执行的资格,即线程调用了 start(),没有执行的权力

运行: 具备执行的资格和具备执行的权力

阻塞: 没有执行的资格和执行权力

销毁: 线程的对象变成了垃圾,开释资源

并发

互联网的我的项目中存在着大量的并发的案例,如卖火车票,电商网站.

范例:火车找有100张票,4个窗口同时买票

剖析: 4个窗口是4个线程同时在运行,100张票是4个线程的共享资源

采纳继承Thread来实现,针对线程的平安问题,咱们须要应用同步(就是要加锁,共享资源智能一个人同时拜访)锁.

语法:

synchronized(锁对象){

//操作共享资源的代码

}

同步代码加在什么中央?

1.代码被多个线程拜访

2.代码中有共享的数据

3.共享数据被多条语句操作

package  com.czz.test01;

public   class  SaleTicket extends  Thread{

   private  String name ;

   public  SaleTicket(String name ) {

      super ( name );

   }

   // 加上 static, 表明 100 张票是共享的数据

   private   static   int   tickets  = 100;

   // 同步锁对象

   private   static   Object   obj  = new   Object ();

   @Override

   public   void  run() {

      while ( true ) {

         // 同步代码块

         synchronized  ( obj ) {

            if ( tickets  > 0) {

                System. out .println( this .getName() + " 正在卖第 "  + tickets -- + " 张票 " );

            } else  {

                System. out .println( " 票已售罄 " );

                break ;

            }

         }

      }

   }

}

 测试对象

package  com.czz.test01;

public   class  TicketTest {

   public   static   void  main(String[] args ) {

      SaleTicket st1  = new  SaleTicket( " 窗口 1" );

      SaleTicket st2  = new  SaleTicket( " 窗口 2" );

      SaleTicket st3  = new  SaleTicket( " 窗口 3" );

      SaleTicket st4  = new  SaleTicket( " 窗口 4" );

      st1 .start();

      st2 .start();

      st3 .start();

      st4 .start();

   }

}