package leanthread;/*
ideal 常用快捷键
https://blog.csdn.net/houfeng30920/article/details/79037647
Ctrl+Alt+O 优化导入的类和包
Alt+Insert 生成代码(如get,set方法,构造函数等) 或者右键(Generate)
fori/sout/psvm + Tab
Ctrl+Alt+T 生成try catch 或者 Alt+enter
CTRL+ALT+T 把选中的代码放在 TRY{} IF{} ELSE{} 里
Ctrl + O 重写方法
Ctrl + I 实现方法
Ctr+shift+U 大小写转化
ALT+回车 导入包,自动修正
ALT+/ 代码提示
CTRL+J 自动代码
Ctrl+Shift+J,整合两行为一行
CTRL+空格 代码提示
CTRL+SHIFT+SPACE 自动补全代码
CTRL+ALT+L 格式化代码
CTRL+ALT+I 自动缩进
CTRL+ALT+O 优化导入的类和包
ALT+INSERT 生成代码(如GET,SET方法,构造函数等)
CTRL+E 最近更改的代码
CTRL+ALT+SPACE 类名或接口名提示
CTRL+P 方法参数提示
CTRL+Q,可以看到当前方法的声明
Shift+F6 重构-重命名 (包、类、方法、变量、甚至注释等)
Ctrl+Alt+V 提取变量
Ctrl+Shift+Alt+N 查找类中的方法或变量
双击SHIFT 在项目的所有目录查找文件
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
CTRL+G 定位行
CTRL+F 在当前窗口查找文本
CTRL+SHIFT+F 在指定窗口查找文本
CTRL+R 在 当前窗口替换文本
CTRL+SHIFT+R 在指定窗口替换文本
ALT+SHIFT+C 查找修改的文件
CTRL+E 最近打开的文件
F3 向下查找关键字出现位置
SHIFT+F3 向上一个关键字出现位置
选中文本,按Alt+F3 ,高亮相同文本,F3逐个往下查找相同文本
F4 查找变量来源
CTRL+SHIFT+O 弹出显示查找内容
Ctrl+W 选中代码,连续按会有其他效果
F2 或Shift+F2 高亮错误或警告快速定位
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+B 快速打开光标处的类或方法
CTRL+ALT+B 找所有的子类
CTRL+SHIFT+B 找变量的类
Ctrl+Shift+上下键 上下移动代码
Ctrl+Alt+ left/right 返回至上次浏览的位置
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/ 注释 或者多行注释
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
Alt+F1 查找代码所在位置
Alt+1快速打开或隐藏工程面板
Alt+left/right 切换代码视图
ALT+ ↑/↓ 在方法间快速移动定位
CTRL+ALT+left/right 前后导航编辑过的地方
Ctrl+Shift+Backspace可以跳转到上次编辑的地
Alt+6查找TODO
3.---------------------其他快捷键-------------------
SHIFT+ENTER 另起一行
CTRL+Z 倒退(撤销)
CTRL+SHIFT+Z 向前(取消撤销)
CTRL+ALT+F12 资源管理器打开文件夹
ALT+F1 查找文件所在目录位置
SHIFT+ALT+INSERT 竖编辑模式
CTRL+F4 关闭当前窗口
Ctrl+Alt+V,可以引入变量。例如:new String();自动导入变量定义
Ctrl+~,快速切换方案(界面外观、代码风格、快捷键映射等菜单)
4.--------------svn快捷键---------------
ctrl+k 提交代码到SVN
ctrl+t 更新代码
5.--------------调试快捷键---------------
其实常用的 就是F8 F7 F9 最值得一提的 就是Drop Frame 可以让运行过的代码从头再来
alt+F8 debug时选中查看值
Alt+Shift+F9,选择 Debug
Alt+Shift+F10,选择 Run
Ctrl+Shift+F9,编译
Ctrl+Shift+F8,查看断点
F7,步入
Shift+F7,智能步入
Alt+Shift+F7,强制步入
F8,步过
Shift+F8,步出
Alt+Shift+F8,强制步过
Alt+F9,运行至光标处
Ctrl+Alt+F9,强制运行至光标处
F9,恢复程序
Alt+F10,定位到断点
6.--------------重构---------------
Ctrl+Alt+Shift+T,弹出重构菜单
Shift+F6,重命名
F6,移动
F5,复制
Alt+Delete,安全删除
Ctrl+Alt+N,内联
Java 多线程:线程的理解
程序进程与线程的理解
1,程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
在执行之前就是存储在硬盘中的数据。
2,进程(process)是程序的一次执行过程,或是正在运行的一个程序。在程序加载到内存中后被cpu处理,
进程是一个动态的过程:有它自身的产生、存在和消亡的过程(生命周期).程序是静态的,进程是动态的
进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。在任务管理器中可以看到正在执行的进程列表
,进程占用的资源是动态变化的。
3,线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。
3.1若一个进程同一时间并行执行多个线程,就是支持多线程的
3.2线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小
3.3一个进程中的多个线程共享相同的内存单元/内存地址空间它们从同一堆中分配对象,可以访问相同的变量和对象。
这就使得线程间通信更简便、高效。但多个线程操作共享的系统资源可能就会带来安全的隐患。
class文件通过类加载器加载到内存中,内存包括堆,虚拟机栈,方法区,本地方法栈,程序计数器,运行时数据区。
通过解释引擎解释命令,提交系统操作,通过垃圾回收器清理内存空间,通过本地方法接口调用本地方法库中的方法。
一个进程有唯一的堆和方法区,被多个线程共享。每个线程有独立的程序计数器和虚拟机栈。共享数据时会出现同步问题。
4,单核CPU和多核CPU的理解
4.1单核CPU,其实是一种虚拟的多线程,因为在一个时间单元内,也只能执行一个线程
的任务。例如:虽然有多车道,但是收费站只有一个工作人员在收费,只有收了费
才能通过,那么CPU就好比收费人员。如果有某个人不想交钱,那么收费人员可以
把他“挂起”(晾着他,等他想通了,准备好了钱,再去收费)。但是因为CPU时
间单元特别短,因此感觉不出来。
4.2如果是多核的话,才能更好的发挥多线程的效率。(现在的服务器都是多核的)
4.3一个Java应用程序java.exe,其实至少有三个线程:main()主线程,gc()
垃圾回收线程,异常处理线程。当然如果发生异常,会影响主线程。
并行与并发
1 并行:多个CPU同时执行多个任务。比如:多个人同时做不同的事。
2 并发:一个CPU(采用时间片)同时执行多个任务。比如:秒杀、多个人做同一件事。
5,使用多线程的优点
背景:以单核CPU为例,只使用单个线程先后完成多个任务(调用多个方
法),肯定比用多个线程来完成用的时间更短,为何仍需多线程?
多线程程序的优点:
6,何时需要多线程
6.1 程序需要同时执行两个或多个任务。
6.2 程序需要实现一些需要等待的任务时,如用户输入、文件读写操作、网络操作、搜索等。
6.3 需要一些后台运行的程序时。
*/
public class ThreadTest1 {
public static void main(String[] args) {
int i = 0;
System.out.println("i = " + i);
i = 10;
System.out.println("i = " + i);
AA aa = new CC();
BB bb = (BB)aa;
System.out.println(aa.getClass());
System.out.println(aa.i);
System.out.println(aa);
System.out.println(bb.getClass());
System.out.println(bb.i);
System.out.println(bb);
new CC().show(new ee());
System.out.println("--------------------");
new CC().show(new ee(){
@Override
public String method() {
return (j + 10 + "");
}
});
}
}
class AA{
int i = 11;
@Override
public String toString() {
return "AA{" +
"i=" + i +
'}';
}
}
class BB extends AA{
public static final double PI = 3.14;
int i = 22;
@Override
public String toString() {
return "BB{" +
"i=" + i +
'}';
}
}
class CC extends BB{
int i = 33;
@Override
public String toString() {
return "CC{" +
"i=" + i +
'}';
}
void show(dd d){
System.out.println(dd.j);
System.out.println(d.method());
}
}
interface dd{
public static double PI = BB.PI;
public static final int j = 10;
public static void method1(){
System.out.println("Hello");
}
public String method();
}
class ee implements dd{
int j = 20;
@Override
public String method() {
return (j + "");
}
public String method1() {
return "World";
}
}