问题原因
在采用多线程启动ssh时候,发现开启的4个线程,最后只运行了最后一个线程,前面3个线程都关闭,通过查找原因是因为:
是匿名对象的原因,匿名对象不是强引用,对象声明生命周期短,当第一条线程执行run之后,二三四条线程应该是被虚拟机回收了。一般多线程都不用匿名对象
问题解决
方法一
//不推荐
new Thread(new Runnable() {
@Override
public void run() {
//业务逻辑
new Exec(bladeUtil.getUSER(),bladeUtil.getPASSWORD(),bladeUtil.getHOST(),bladeUtil.getDEFAULT_SSH_PORT(),bladeUtil.getBladeName());
}
}).start();
方法二(推荐)
//推荐,或者如果多线程用线程池
ThreadBlake1 threadBlake1 =new ThreadBlake1(bladeUtil1);
threadBlake1.start();
public class ThreadBlake1 extends Thread{
private BladeUtil bladeUtil1;
public ThreadBlake1(BladeUtil bladeUtil1) {
this.bladeUtil1 = bladeUtil1;
}
@Override
public void run() {
// super.run();
new Exec(bladeUtil1.getUSER(),bladeUtil1.getPASSWORD(),bladeUtil1.getHOST(),bladeUtil1.getDEFAULT_SSH_PORT(),bladeUtil1.getBladeName());
}
}
额外补充
开发ssh多线程只跑最后一个线程解决办法部分的记录就先到这!接下来,是一些整理的c++要点概要!
多态
- 多态分为静态多态和动态多态。 而动态多态是通过虚表实现, 静态多态包括重载和模板, 这和虚表没关系。
- C++中的虚函数的作用主要是实现了多态的机制。 而虚函数是通过虚函数表(V-Table)实现的。构造函数不能声明为虚函数, 析构函数可以声明为虚函数, 而且有时是必须声明为虚函数。
- 构造函数为什么不能声明为虚函数?
答: 1 构造一个对象的时候, 必须知道对象的实际类型, 而虚函数行为是在运行期间确定实际类型的。 而在构造一个对象时, 由于对象还未构造成功。 编译器无法知道对象的实际类型是该类本身, 还是该类的一个派生类, 或是更深层次的派生类。 无法确定。
2 虚函数的执行依赖于虚函数表。 而虚函数表在构造函数中进行初始化工作, 即初始化 vptr,让他指向正确的虚函数表。 而在构造对象期间, 虚函数表还没有被初始化, 将无法进行。 析构函数执行时先调用派生类的析构函数, 其次才调用基类的析构函数。 - 析构函数为什么声明为虚函数?
答: 如果析构函数不是虚函数, 而程序执行时又要通过基类的指针去销毁派生类的动态对象,那么用 delete 销毁对象时, 只调用了基类的析构函数, 未调用派生类的析构函数。 这样会造成销毁对象不完全。包含至少一个纯虚函数的类视为抽象类。
三种权限
文件打开权限
- r 打开读写文件 该文件必须存在
- r+打开读写文件 该文件必须存在
- w 打开只写文件 文件存在则长度清零 文件不存在建立文件
- w+打开读写文件 文件存在则长度清零 文件不存在建立文件
- a 以附加方式打开只写文件 文件不存在建立文件 文件存在写入的数据加到文件末尾
- a+以附加方式打开读写文件 文件不存在建立文件 文件存在写入的数据加到文件末尾(读写必须有+)
引用
- 始终用 const 限制所有指向只读输入参数的指针和引用
- 优先按 const 的引用取得其他用户定义类型的输入(因为可以提高程序的执行效率, 无需创建
参数的副本) - 如果函数需要修改其参数副本,则可以考虑通过值传递代替通过引用传递(注: 所的修改参
数副本就是在函数内修改引用的参数, 使用值传递不会改变原来的值, 而引用传递会改变参
数以前的值 )