关于java:我在上海乐字节学习Java的第二十三天持续更新中

5次阅读

共计 2351 个字符,预计需要花费 6 分钟才能阅读完成。

线程的概述

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

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

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

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();

   }

}

正文完
 0