线程

线程

1.三种线程

1.继承Thread

main方法也是一个线程

  1. 新建线程:新建类继承Throw,重写run方法

    public class Test() extends Throw(){
        public void run(){
            线程需要执行的内容;
        }
    }
    
  2. 创建线程:

    Test test = new Test();
    
  3. 启动线程:创建一个新的栈,而不是创建栈帧

    test.start();
    
2.实现Runnable
  1. 新建线程:新建线程类,实现Runnable接口,重写run方法

    public class Test implements Runnable{
        public void run(){
            线程内容;
        }
    }
    
  2. 创建线程对象

    Test test = new Test();
    
  3. 新建线程

    Thread thread = new Thread(thread[,"线程名"]);
    
  4. 执行线程

    thread.start();
    
3.使用Callable和Future
  1. 新建线程:新建范方法线程类,实现Callable类,重写call方法
    可以抛出异常而不需要必须在县城里处理

    public class Test implements Callable<call方法返回值>{
        public Integer call() throws Exception{
            线程内容;
        }
    }
    
  2. 新建线程对象

    Test test = new Test();
    FutureTask<Integer> result = new FutureTask<>(test);
    
  3. 执行线程

    Thread thread = new Thread(result);
    
  4. 执行线程

    therad.start();
    
  5. 返回值:get()会阻塞到结束时执行

    try{
        Integer sum = result.get();
    }catch(){}
    

2.相关内容

1.匿名内部类
  1. Thread

    Thread thread = new Thread(){
        public void run(){
        }
    }
    thread.start();
    
  2. Runnable

    Thread thread = new Runnable(){
        public void run(){
        }
    }
    new Thread(thread.start());
    
2.Thread对象
  1. 获取线程对象(静态)

    1. run方法内

      只适用于实现Runnable或Callable的接口的run方法内执行

      不能使用this,this指的是线程类这一个对象,而静态方法获取的是不同的三个对象

      Thread thread = Thread.currentThread();
      
    2. 线程外获取对象

      Test test = new Test();
      Thread thread = new Thread(test);
      
  2. 获取线程名

    String name = thread.getName();
    
  3. 获取线程id

    Int id = thread.getId()
    
  4. 获取线程优先级[见下文]

    thread.getPriority();
    
  5. 检查是否处于活动状态[见下文]

    线程处于:就绪/运行/阻塞返回true,处于新建/结束返回flase;

    thread.isAlive();
    
  6. 检查是否为守护线程[见下文]

    thread.isDaemon();
    
  7. 检查是否被中断

    thread.isInterrupted();
    
3.优缺点

​ 建议使用Runnable或Callable

  1. 由于java里一个类只能继承一个父类,所以Thread只能继承一个父类,而runnable和callable可以继承多个父类
  2. runable和callable可以实现代码的分离,面向对象
  3. runable和callable代码复杂,获取线程对象要用Thread.currentThread()方法,而thread可以直接对象点;

3.生命周期

  1. 图表

    状态线程
    新建使用new关键字创建线程后
    就绪线程对象调用start()方法后
    运行获得cpu资源,执行run方法体后
    死亡run()结束/错误/执行stop()
  2. 图示

    线程从阻塞状态只能进入就绪状态

在这里插入图片描述
3. 注意事项

  1. 主线程和子线程:

    主线程和子线程有相同的地位,子线程不收主线程的影响,主线程结束后子线程可以继续执行;

  2. start()

    对新线程两次调用start()或者对死亡的线程调用start()都会抛出异常illegalThreadStateException

    调用run()方法以后不能再次调用start()方法会抛出异常

4.控制线程

  1. 新建线程:

    Thread/Runnable/Callable

    Test test = new Test();
    Thread thread = new Thread(test);
    
1.join

因为阻塞后会处于就绪,因此.start()可以解除join

  1. 在therad2线程中调用thread.join()方法,therad2会被一直阻塞,直到therad执行完毕

    thread.join();
    
  2. 在therad2线程中调用thread.join(n毫秒)方法,therad2会被一直阻塞n毫秒

    thread.join(n);
    
2.后台线程(守护线程)
  • 注意事项:
    • 当前台线程全部执行完毕,守护线程也随之结束,jvm的gc就是守护线程,
    • 线程处于:就绪/运行/阻塞返回true,处于:新建/结束返回flase;
    • 前台线程创建的默认是前台线程,后台线程创建的线程默认是后台线程;
  1. 设置为后台线程

    必须在thread.start()之前执行,否则返回illegalThreadStateException

    thread.setDaemon(true);
    
  2. 获取当前线程状态

    boolean flag= thread.getDaemon();
    
3.sleep(线程休眠)

可能发生死锁,尽量少使用,run方法内执行

  1. 让thread线程休眠

    Thread.sleep();
    
  2. 让thread休眠n毫秒(收系统精度影响)

    Thread.sleep(n);
    
4.yield(线程让步)

移植性低,不建议使用,建议使用sleep

会将线程强制转换到就绪状态,而不是阻塞,在执行后会暂停并给大于等于自身优先级的线程(包括)执行机会,

Thread.yield();
5.设置优先级

每个线程默认的优先级都与创建它的父线程优先级相同;

  1. 优先级级别

    1. 范围从1-10,但是由于要受操作系统的影响,所以应该尽量使用常量优先级

    2. 常量优先级

      常量级别
      Thread.MAX_PRIORITY10
      Thread.MIN_PRIORITY1
      Thread.NORM_PRIORITY5(main)
  2. 获取优先级

    int x = thread.getPriority();
    
  3. 设置优先级

    thread.setPriority(优先级);
    

5.线程同步

  1. 并发问题的原因

    int total2=2000
    if(total>total2){			//1
        syso("取钱成功:");
        total2=total2-1500;		//2
    }
    

    如果线程1在经过1时正好堵塞,线程2在此期间执行完毕,这时线程1再执行完毕则出现错误;也就是说有同时执行1的可能

  2. 同步代码块

    参数是同步监视器:当一个线程使用obj时阻止其他线程使用,直到代码块执行完毕

    • 同步监视器:obj,需要竞争的对象资源
    • 同步代码块:需要执行的操作
    synchronized(obj){			//加锁
    	同步代码块				//修改
    }							//释放锁
    
  3. 同步方法

    被synchronized修饰的方法,默认同步监视器是this就是当前对象;

    public synchronized void XXX(){
        同步代码块
    }
    
  4. 同步监视器

    1. 释放同步监视器的锁定
      1. 同步方法或代码块执行结束
      2. 遇到break/return提前结束同步方法或代码块
      3. 出现未处理的error或Exption导致同步放那个发或代码块结束
      4. 执行了同步监视器对象的wait()方法,使当前线程暂停会释放监视器
    2. 不释放同步监视器的锁定
      1. Thread.sleep()/Thread.yield()
      2. suspend()将线程挂起
以下是重新表述后的内容: 单周期 MIPS CPU 的微程序地址转移逻辑设计:在单周期 MIPS CPU 架构中,微程序地址转移逻辑是关键部分。它负责根据当前微指令的执行情况以及 CPU 内部的各种状态信号,准确地计算出下一条微指令的地址。这一逻辑需要综合考虑指令类型、操作完成情况、是否发生异常等多种因素,以确保微程序能够按照正确的顺序和逻辑进行执行,从而实现 MIPS 指令的准确译码与控制。 MIPS 微程序 CPU 的设计:设计一款基于微程序控制的 MIPS CPU,其核心在于构建微程序控制器。该控制器通过存储微指令序列来实现对 CPU 各部件的控制。微指令中包含对数据通路操作的控制信号以及微程序地址转移信息。在设计过程中,需要精心设计微指令格式,使其能够高效地表示各种操作控制信息,同时合理安排微指令存储器的组织结构,确保微指令的快速读取与准确执行,从而实现 MIPS 指令集的完整功能。 MIPS 硬布线控制器的状态机设计:在采用硬布线控制方式的 MIPS CPU 中,状态机是控制器的核心组成部分。状态机根据输入的指令操作码、状态信号等信息,在不同的状态之间进行转换。每个状态对应着 CPU 在执行一条指令过程中的一个特定阶段,如取指、译码、执行、访存等。状态机的设计需要精确地定义各个状态的转换条件以及在每个状态下输出的控制信号,以确保 CPU 能够按照正确的时序和逻辑完成指令的执行过程。 多周期 MIPS 硬布线控制器 CPU 设计(排序程序):设计一款多周期 MIPS 硬布线控制器 CPU,用于运行排序程序。在这种设计中,CPU 的每个指令执行周期被划分为多个子周期,每个子周期完成指令执行过程中的一个特定操作。硬布线控制器根据指令操作码和当前周期状态,生成相应的控制信号来协调 CPU 数据通路的操作。针对排序程序的特点,需要优化控制器的设计,合理安排指令执行的周期划分
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值