2019/07/20的java准备

本文详细解析了程序、进程和线程的概念及其之间的区别与联系,包括它们的定义、特点以及如何通过继承Thread类或实现Runnable接口来创建线程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 早上查题,背一遍然后检查自己一遍以上
  • 中午有时间就背一遍以复习昨天的为主
  • 晚上背一遍,第二天中午再看一眼:day+1
  • 第四天课间看一遍:day+3
  • 第七天课间看一遍:day+6
  • 第十五天课间看一遍:day+14

简述程序、进程和线程的联系和区别。
1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体
2)进程则不同,它是程序在某个数据集上的执行。
进程是一个动态的实体,它有自己的生命周期。
它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据集上运行的全部动态过程。
3)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成为不同的进程。而一个程序有可能没有与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运行在几个不同的数据集上)。
4)进程还具有并发性和交往性,这也与程序的封闭性不同。

  • 线程进程:实现多任务的技术

  • 区别:

    • 多进程是多个程序实现多任务,多线程是程序内部的多个流程实现多任务
    • 多进程之间数据不共享(软件间数据不共享),多线程之间数据部分共享(同个软件不同任务)。
    • 多进程切换开销大,多线程切换开销小

创建线程的两种方式分别是什么?各有什么优缺点。
1.继承Thread类,重写run方法,调用start函数
2.实现Runnable接口,实现run方法,把接口对象用来生成Thread类对象,
采用继承Thread类方式:
(1)优点:编写简单,如果需要访问当前线程,无需使用Thread.currentThread()方法,直接使用this,即可获得当前线程。
(2)缺点:因为线程类已经继承了Thread类,所以不能再继承其他的父类。
采用实现Runnable接口方式:
(1)优点:线程类只是实现了Runable接口,还可以继承其他的类。在这种方式下,可以多个线程共享同一个目标对象,所以非常适合多个相 同线程来处理同一份资源的情况,从而可以将CPU代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。
(2)缺点:编程稍微复杂,如果需要访问当前线程,必须使用Thread.currentThread()方法。


*sleep、yield、join、wait方法的区别?
sleep()
  sleep()方法需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行,进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。但是sleep()方法不会释放“锁标志”,也就是说如果有synchronized同步块,其他线程仍然不能访问共享数据。
  
wait()
  wait()方法需要和notify()及notifyAll()两个方法一起介绍,这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用,也就是说,调用wait(),notify()和notifyAll()的任务在调用这些方法前必须拥有对象的锁。注意,它们都是Object类的方法,而不是Thread类的方法。
  wait()方法与sleep()方法的不同之处在于,wait()方法会释放对象的“锁标志”。当调用某一对象的wait()方法后,会使当前线程暂停执行,并将当前线程放入对象等待池中,直到调用了notify()方法后,将从对象等待池中移出任意一个线程并放入锁标志等待池中,只有锁标志等待池中的线程可以获取锁标志,它们随时准备争夺锁的拥有权。当调用了某个对象的notifyAll()方法,会将对象等待池中的所有线程都移动到该对象的锁标志等待池。
  除了使用notify()和notifyAll()方法,还可以使用带毫秒参数的wait(long timeout)方法,效果是在延迟timeout毫秒后,被暂停的线程将被恢复到锁标志等待池。
  此外,wait(),notify()及notifyAll()只能在synchronized语句中使用,但是如果使用的是ReenTrantLock实现同步,该如何达到这三个方法的效果呢?解决方法是使用ReenTrantLock.newCondition()获取一个Condition类对象,然后Condition的await(),signal()以及signalAll()分别对应上面的三个方法。

yield()
  yield()方法和sleep()方法类似,也不会释放“锁标志”,区别在于,它没有参数,即yield()方法只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行,另外yield()方法只能使同优先级或者高优先级的线程得到执行机会,这也和sleep()方法不同。

join()
  join()方法会使当前线程等待调用join()方法的线程结束后才能继续执行


死锁是怎么造成的?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程.


死锁发生的必要条件:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。


为什么不推荐使用stop和destroy方法来结束线程的运行?
stop()-----线程中stop()方法作为一种粗暴的线程终止行为,在线程终止之前没有对其做任何的清除操作。解除由该线程获得的所有对象锁头,而且可能使对象处于不连贯状态
destroy()-----强制终止线程,但该线程不会释放对象锁

推荐wait、sleep等方法,暂停进程的运行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值