04747-Java(十)——多线程
- 进程是程序的一次执行(进程本身不是程序),对应了代码加载、执行至执行完毕的一个完整过程,或者说是程序在处理机中的一次运行。
- 进程既包括其所要执行的命令,又包括执行指令所需的任何系统资源,如CPU、内存空间、I/O端口等。
- Java中线程的状态共有4种,分别为:新建、可运行状态、死亡、阻塞。
- Java对被阻塞的线程是如何处理的?【背】
在Java中,所有被阻塞的线程按次序排列,组成一个阻塞队伍。而所有就绪但没有运行的线程则根据其优先级进入一个就绪队列,当CPU空闲时,如果就绪队列不空,队列中第一个具有最高优先级的线程将运行。当一个线程被抢占而停止运行时,它的运行状态被改变并放到就绪队伍的队尾;同样,一个被阻塞的线程就绪后通常也放到就绪队列的队尾。 - 线程:线程是进程执行过程中产生的多条执行线索,是比进程单位更小的执行单位,线程在形式上同进程十分相似,都是用一个按序执行的语句序列来完成特定的功能,不同的是,线程没有入口,也没有出口,自身不能自动运行,必须栖身于某一个进程中,由进程触发执行,并且属于同一进程的线程共享该进程的系统资源。【背】
- 要让某个子类对象实现多线程:声明实现Runnable接口,在类内实现run()方法,声明和创建线程对象,并让该对象调用start()方法。
- 线程的结构都包含哪些部分,作用分别是什么?【背】
在Java中,线程由虚拟CPU、执行的代码、处理的数据三部分组成。
虚拟CPU的作用是控制整个线程的运行,
执行的代码的作用是由Thread类控制按序运行,
处理的数据的作用是传递给 Thread类,由代码在执行过程中进行处理。 - 用 Thread类的子类创建线程的过程是什么?【背】
(1)从Thread类派生出一个子类,在类中一定要实现run()
(2)用派生出的子类创建一个对象。
(3)用start()方法启动线程。 - 请说明创建线程两种方法的适用条件:【背】
(1)适用于采用实现 Runnable接口的情况:因为Java只允许单重继承,如果一个类已经继承了 Thread,就不能再继承其他类,这就被迫采用实现 Runnable的方法。另外,由于原来的线程采用的是实现 Runnable接口的方法,可能会出于保持程序风格的一贯性而继续使用这种方法。
(2)适用于采用继承 Thread方法的情况:当一个run()方法置于 Thread类的子类中时,this实际上引用的是控制当前运行系统的 Thread实例,部分代码比较简洁,所以许多Java程序员愿意使用继承 Thread的方法。 - 使用 synchronized 修饰一个方法时,整个方法会被同步。这意味着同一时间只有一个线程可以访问这个方法。
- 请写出用Thread类的子类创建线程并启动线程所包含的步骤:
(1)从Thread类派生出一个子类。(1分)
(2)实现run()。(1分)
(3)用该类创建一个对象。(1分)
(4)用start()方法启动线程。(1分) - notify()/notifyAll()可以将等待队列中线程唤醒。
- sleep()/wait()/join()可以将线程挂起。
- yield()强制终止线程的执行。
- 同优先级的线程按“先进先出”调度原则。
- 线程优先级的高低可能影响线程执行的先后顺序,但不是阻塞的原因。
- Java对线程的调度采取优先级策略。
- Java中断线程执行的方法:interrupt
- 运行状态的线程执行stop方法后进入死亡状态。
- 编译器在编译阶段无法检测到死锁。
- synchronized修饰操作共享数据的一个变量或一个方法。
- Java中如何实现“对象互斥锁”?【背】
Java语言中,有两种方法可以实现“对象互斥锁”,一是用关键字volatile来声明一个共享数据(变量),二是用关键字 synchronized来声明操作共享数据的一个方法或一段代码。 - 请写出在Java语言中,关键字synchronized的作用:【背】
(1)使用关键字synchronized定义临界段(1分),
(2)能对共享对象的操作上锁(2分) - wait可以释放当前当前线程持有的对象互斥锁。
- 线程的四种状态:新建,可运行状态,死亡,阻塞。
- wait和sleep常引起阻塞。
- 调用start可使线程出于可运行。
- 线程优先级:级别最低是1,默认级别是5,最高级别是10。
- sleep和yield可以给同等优先级的其他线程一个运行的机会。
- Thread的静态方法currentThread可以引用正在运行的线程。
- Thread类的setPriority可以设置线程优先级。
- Thread中代表最高优先级的常量:MAX_PRIORITY
- synchronized可以阻止多个线程同时访问同一个条件变量。
- 用关键字synchronized标识的代码段或方法即为“对象互斥锁”锁住的部分。
- synchronized语句的参数必须是this。
- 当持有锁定标志的线程运行完synchronized()调用包含的程序块后,这个标志将会被:自动返还。
- 什么时候需要考虑线程的互斥问题?【背】
当同时运行的线程需要共享数据时需要考虑线程的互斥问题。 - 在调用一个对象的wait方法时,必须持有该对象的:锁定标识。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 珍珠巧克力!
评论
GitalkValine