2022.10.23
多线程
1.
/**
* 乜有加while时,只有窗口一一个线程加上之后有了交叉的线程
*/
@Override
public void run() {
while (true){ //加上之后有了几个线程
show();
}
}
private static synchronized void show() { //监视器:当前类
if (tickets > 0){
System.out.println(Thread.currentThread().getName() + ":卖票,票号是:" + tickets);
tickets--;
try {
sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
继承thread的同步方法,乜有加while(true)之前,只执行窗口一,加上之后开始交叉执行!
为什么加上循环就有了交叉??
2.java.lang.NoClassDefFoundError: Could not initialize class utils.JDBC_Utils
出了这个异常后,自然而然想到jar包中可能没有这个类,查看包中发现有这个类!如果没有这个类会抛出ClassNotFoundException;
继续深究,发现异常信息是java.lang.NoClassDefFoundError: could not initialize class:xxxxxx,自然而然想到java的类加载机制。
java类加载陆续经历,加载、验证、准备、解析、初始化等阶段,而上述异常表明是在初始化阶段出了问题。
在类的初始化阶段,执行方法(由编译器加入),它收集了静态代码块、静态变量赋值,收集顺序与源码中的顺序一致,执行完方法后,才完成类的加载。如果过程中出现错误,会导致类初始化失败。
基于这个原理,再回头看代码,发现类中的静态代码块中出现了异常,但是没有catch,导致出现异常。
解决方案:把静态代码块中的代码try-catch一下,把异常抛出去继续执行
3.不是source1,会报空指针(复习静态代码块)
private static DataSource source1; static { try { Properties pros = new Properties(); InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties"); pros.load(is); source = DruidDataSourceFactory.createDataSource(pros); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConnection3() throws SQLException { Connection conn = source.getConnection(); return conn; }