阿里第二次电面

2019-04-13 13:08发布

1. 垃圾回收机制2.死锁3.跟ipv6相关的技术4. 项目里面是怎么读取到邮件的?用了哪些库?5.职业规划6.tcp如何建立连接7.指针8.java 和python各自的优点9.yeiled的使用

Java死锁:进程循环等待它方占有的资源而无限制的僵持下去的局面。

      同步代码块中都去争夺同一资源,互不相让。举个例子,在一条东西方向的狭窄的巷道中,AB两车相遇,互补退让,结果是两个车都走不了,这就是死锁。这里隐含了一个情景就是,A车占有东边这一段道路,它需要B车让出B车占有西边的道路,而同时B车占有西边的道路,它需要A车让出A车所占有的西边的道路。两车各自占有各自的资源,且同时争夺对方占有的资源,互补相让,就造成了死锁。     在死锁时,线程间相互等待资源,而又不释放自身的资源,导致无穷无尽的等待,其结果是系统任务永远无法执行完成。死锁问题是在多线程开发中应该坚决避免和杜绝的问题。消除死锁的几种方式:1. 最简单、最常用的方法就是进行系统的重新启动,不过这种方法代价很大,它意味着在这之前所有的进程已经完成的计算工作都将付之东流,包括参与死锁的那些进程,以及未参与死锁的进程;2. 撤消进程,剥夺资源。终止参与死锁的进程,收回它们占有的资源,从而解除死锁。这时又分两种情况:一次性撤消参与死锁的全部进程,剥夺全部资源;或者逐步撤消参与死锁的进程,逐步收回死锁进程占有的资源。一般来说,选择逐步撤消的进程时要按照一定的原则进行,目的是撤消那些代价最小的进程,比如按进程的优先级确定进程的代价;考虑进程运行时的代价和与此进程相关的外部作业的代价等因素;3. 进程回退策略,即让参与死锁的进程回退到没有发生死锁前某一点处,并由此点处继续执行,以求再次执行时不再发生死锁。虽然这是个较理想的办法,但是操作起来系统开销极大,要有堆栈这样的机构记录进程的每一步变化,以便今后的回退,有时这是无法做到的。关键字:synchronized ;执行了锁所属对象的wait()方法,这个线程会释放锁;加锁和释放锁的时候一定要通过try-finally的方式来操作,防止在加锁之后程序异常退出没有调用 lock.unlock() 方法释放锁避免死锁的一个通用的经验法则是:当几个线程都要访问共享资源A、B和C时,保证使每个线程都按照同样的顺序去访问他们,比如都先访问A,再访问B和C。---------------------------------------------------------------------------------------------------------------------------------yield
(1)在python中:一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。python中生成器是迭代器的一种,使用yield返回函数值。每次调用yield会暂停,而可以使用next()函数和send()函数可以恢复生成器。(2)Java线程中的Thread.yield( )方法:Thread.yield( )方法即为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。        yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!举个例子:现在有很多人在排队上厕所,好不容易轮到这个人上厕所了,突然这个人说:“我要和大家来个竞赛,看谁先抢到厕所!”,然后所有的人在同一起跑线冲向厕所,有可能是别人抢到了,也有可能他自己有抢到了。我们还知道线程有个优先级的问题,那么手里有优先权的这些人就一定能抢到厕所的位置吗? 不一定的,他们只是概率上大些,也有可能没特权的抢到了。----------------------------------------------------------------------------------------------------------------------------------java 和python各自的优点
1. Python作为动态语言,很灵活。语法简洁,表达力强。语法简洁优美, 功能强大, 标准库跟第三方库灰常强大, 应用领域非常广Python可以让初学者把精力集中在编程对象和思维方法上,而不用去担心语法、类型等等外在因素;
yield关键字:
当你需要返回很多东西然后一个一个用的时候, 你可以一次返回一个,相当于一个生成器,可以用来返回函数值。
def xrange(n): i = 0 while i < n: yield i i += 1 用法: for i in xrange(10): print i 2. java 优美, 严谨, 健壮,不易出错(尽量避免了程序员犯错, 比如自动垃圾回收, 抛弃无符号类型, 安全的枚举, 编译期泛型检查等等);----------------------------------------------------------------------------------------------------------------------------------
项目里面是怎么读取到邮件的?用了哪些库?调用win32com里面的outlook接口,import win32com.client然后调用里面的getTemplate()方法
def getTemplate(self, sheet, updateFlag = True) 关于selenium: 调用selenium模块下的webdriver, from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.wait import WebDriverWait from xml.etree import ElementTree as ET import os,time, shutil, re from __builtin__ import classmethod from datetime import datetime利用装饰器下的一个函数来规定浏览器下载文件后存放的位置;webdriver下的options方法来定义了一个startChrom()函数;登录函数:
def login(self, user, password): self.driver.find_element_by_id("user").clear() self.driver.find_element_by_id("user").send_keys(user) self.driver.find_element_by_id("password").clear() self.driver.find_element_by_id("password").send_keys(password) self.driver.find_element_by_id("IMAGE1").click() try: WebDriverWait(self.driver, 10).until(EC.visibility_of_any_elements_located((By.LINK_TEXT,"Activation"))) except Exception as e: print e.message return False else: return True