002 - 什么是线程

1 - 线程
  • 简单理解,线程就是进程中一条执行路线 ,一个单一的控制执行流程。
    • 比如一个进程是"读取后台数据同时渲染到用户界面反馈给用户",因为读取用户数据时间长,所以单开一个线程单独处理此事,另有一个渲染页面线程
    • 和进程一样,每个线程都有独立的控制流程,由操作系统调用
    • 不同的地方时,同一个进程的各个线程之间是共享存储空间。这样做,好处是方便通信,缺点是不利于同步
    • 一个进程可以拥有多个线程
  • 多线程的优点
    • 更好的实现并行,提高复杂应用性能
    • cpu在线程之间切换,比在进程之间切换,开销小很多、
    • 创建和撤销线程,开销也很小
2 - 多线程实现
  • 在http服务器中,比如tomcat、jboss 中,服务器已经帮我们实现了多线程,每一个请求都是多线程的

  • 学习阶段,在Java API中实现多线程, 在这里下载了api中文文档 (mac 环境下,需单独下载chm 阅读)
    在这里插入图片描述

  • 上图中,可以清晰看到 Java中 thread 特点

    • 每个线程都有优先级,高的先执行,当一些线程中运行代码创建一个新的Thread时,新线程的优先级最初设置为等于创建线程的优先级
    • 只有守护进程才可创建守护线程
  • 线程退出

    • exit类的方法Runtime已经被调用并且安全管理器允许退出操作发生。
    • 不是守护进程线程的所有线程都已经死亡,无论是从调用返回到run方法还是抛出异常,传播超出了run
  • 创建线程的方法

    • 将一个类声明为一个Thread的子类,重写run类的方法,启动线程并运行

      // 定义 
      class PrimeThread extends Thread {
               long minPrime;
               PrimeThread(long minPrime) {
                   this.minPrime = minPrime;
               }
      
               public void run() {
                   // compute primes larger than minPrime
                    . . .
               }
           }
       // 启动 ,main方法类
      class Test{
        public static void main(String[] args){
          PrimeThread p = new PrimeThread(143);
           p.start();
        }
      }
           
      
    • 声明一个实现Runnable接口的类

      // 定义 
      class PrimeRun implements Runnable {
               long minPrime;
               PrimeRun(long minPrime) {
                   this.minPrime = minPrime;
               }
      
               public void run() {
                   // compute primes larger than minPrime
                    . . .
               }
           }
       // 启动 ,main方法类
      class Test{
        public static void main(String[] args){
          PrimeRun p = new PrimeRun(143);
          new Thread(p).start(); // 注意 实现runnable的类,需要作为传参传入thread类中,调用start启动
        }
      }
        
      
  • Thread类构造函数

    Constructor描述
    Thread()分配一个新的 Thread对象。
    Thread(Runnable target)分配一个新的 Thread对象。
    Thread(ThreadGroup group, Runnable target)分配一个新的 Thread对象。
  • Thread 类常用方法 : 静态方法

    • interrupted() 测试当前线程是否已中断。 该方法可以清除线程的*中断状态
      • isInterrupted() 不会修改线程的中断状态
    • sleep() : 使当前正在执行的线程停留(暂停执行)指定的毫秒数,这取决于系统定时器和调度程序的精度和准确性
    • yield() :对调度程序的一个暗示 , 启发式尝试,调度程序可以自由地忽略这个提示,很少用这种方法
  • Thread类 常用方法 : 普通方法

    • run() : 实现Thread的类,需要重写此方法
    • getId()、 getState()、 getName()、getPriority() : 获取线程的一些信息
    • join() :等待这个线程死亡
    • interrupt() : 中断这个线程
    • setDaemon() : 设置成后台线程
  • 注意 : 线程 Thread类中,很多不推荐使用方法

    • 比如 stop() , 线程不能主动停止
3 - 线程优先级
  • JDK中修改线程优先级 :

    public static final int MIN_PRIORITY
    public static final int NORM_PRIORITY
    public static final int MAX_PRIORITY
    public final void setPriority(int newPriority)
    
  • 修改了线程优先级后,优先级高的线程有机会先执行

    class TestPriority implements Runnable{
       private int priority;
       private  volatile double a;
       TestPriority(int priority){this.priority = priority}
       public void run(){
         Thread.currentThread.setPriority(priority); // 设置优先级
         for(i=1 to 1000000){
           a +=(Math.Pi+Math.E);
           if(i % 1000 == 0) Thread.yield(); // 每1000个数就交出控制权
         }
         println(Thread.currentThread.getName()+"*"+Thread.currentThread.getPriority());
       }
       main(){
         for (int i = 0; i < 5; i++) {
                new Thread(new SimplePriority(Thread.MIN_PRIORITY)).start();
                new Thread(new SimplePriority(Thread.MAX_PRIORITY)).start();
            }
       }
    }
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值