安恒实习
公司项目
异常的处理
如果是无法处理的异常,则抛给它的调用者;由于项目的debug只能通过日志,但出现异常时要通过日志输出异常,方便debug,并且不能影响整体程序的正常运行。
拓展学习
<<并发编程之美学习>>
wait()方法补充
在调用wait()方法时,如果线程持有某共享变量的锁,怎么会释放该共享变量的锁,但该线程持有的其他共享变量的锁不会被释放. For example
A、B线程同时启动,竞争共享资源a、b的锁,为了让a先获得锁,b线程sleep1秒。
线程A持有a、b两个共享变量的锁,当调用a.wait(),此时线程B一直在阻塞获得a的锁,调用wait方法后会释放a的锁,线程B成功获得了锁,但在尝试获得b的锁时,由于未释放,会一直阻塞。
复制代码
yield
Thread类中有一个静态的yield方法,当一个线程调用yield方法时,实际就是在暗示线程调度器当前线程请求让出自己的cpu使用,但是线程调度器可以无条件忽略这个暗示。 我们知道操作系统是为每个线程分配一个时间片来占有CPU的,正常情况下当一个线程把分配给自己的时间片使用完后,线程调度器才会进行下一轮的线程调度,而当一个线程调用了Thread类的静态方法yield时,是在告诉线程调度器自己占有的时间片中还没使用完的部分自己不想使用了,这暗示线程调度器现在就可以进行下一轮的线程调度。
线程中断中的interrupted()方法
检测当前线程是否被中断,如果是返回true,否则返回false。与isInterrupted不同的是,该方法如果发现当前线程被中断,则会清除中断标志,并且该方法是static方法,可以通过Thread类直接调用。另外从下面的代码可以知道**,在interrupted()内部是获取当前调用线程的中断标志而不是调用interrupted()方法的实例对象的中断标志。**
public class interuptedTest {
public static void main(String[] args) throws InterruptedException{
Thread threadOne = new Thread(new Runnable() {
@Override
public void run() {
for(;;) {
}
}
});
threadOne.start();
threadOne.interrupt();
System.out.println("IsInterrupted:" + threadOne.isInterrupted());
System.out.println("isInterrupted:" + threadOne.interrupted());
System.out.println("isInterrupted:" + Thread.interrupted());
System.out.println("isInterrupted:" + threadOne.isInterrupted());
System.out.println("mian thread is over");
}
}
复制代码
上面的代码输出结果如下
每日一题
跳跃游戏II(贪心问题)
题目
给定一个非负整数数组,你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
示例:
输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。 说明:
假设你总是可以到达数组的最后一个位置。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ju… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
题目是典型的贪心问题,一种方法是穷举,然后取最小的那个,但是这样的时间复杂度是O(n^n)代价太高了。因此考虑,每一次都走到能到达的最远的位置,比如示例中的[2,3,1,1,4],起点是第0格,可跳两格。如果跳到第一格,能到达的是2、3、4三个位置;如果跳到第二格,能到达的位置是3。 也就是说如果跳到第一格,它的“射程”范围包含了其他几种可能性,因此我们只需要计算它能否跳到终点即可。
代码
class Solution {
public int jump(int[] nums) {
int[] result = new int[1];
int n = nums.length-1;
result[0] = n;
util(nums,result, 0, n, 0);
return result[0];
}
public static void util(int[] nums, int[] result, int i, int n, int count) {
int jump = nums[i];
count++;
if((i + jump) >= n) {
if (count < result[0]) result[0] = count;
} else {
int max = 0;
int index = i;
for (int j = i; j <= i + jump; j++) {
if ((j + nums[j]) > max) {
max = j + nums[j];
index = j;
}
}
util(nums, result, index, n, count);
}
}
}
复制代码