线程机制理解
开启线程: Thread thread = new Thread(Runnable).start();
thread.stop()方法是直接停止线程,这个方法已被启用,由于线程是开发者自己开启的,里面的内容也是开发者写的,线程最好停止的方式是线程自己控制,现在外部线程控制另一个线程的死亡是不安全的,停止线程很有用,但是也很没用.
thread.interrutp(),现在提供这种方式停止线程,其本质是向目标线程发起一个中断标记,目标线程获取这个中断标记可以自己控制(开发者控制)是否关闭,这种 方式就是线程自己处理自己的关闭与否
中断注意事项,可以通过线程自己的interrupt方法判断是否标记了中断,这个状态是不变的,还有一个是Thread.interrupted()该方法可以用来判断当前线程是否中断,但是他有一个处理,就是判断完之后就把状态给重置了,这个和thread对象的中断有点区别需要注意,还有一点就是Thread.sleep()方法,调用该方法要处理异常try{}catch(InterruptedException),如果是sleep状态的中断的话会执行异常处理并且把状态重置,所有如果要停止线程要在异常处理return,否则线程停止不掉。
锁的wait() notifyAll()理解
class TestWait{
private String sharedString;
private synchronized void initString(){
sharedString = "huo";
notifyAll();
}
private synchronized void printString(){
while(sharedString == null){
try { wait(); }catch(InterruptedException e){ e.printStackTrace()}
}
System.out.println("String: " + sharedString);
}
}
wait会释放锁,当执行打印的时候如果没有初始化,执行锁的wait(),当前持有锁的线程就被挂起放到等待队列,后面的线程也是如此都放入等待队列,当初始化线程执行初始化后通知,所有的等待线程会被唤醒抢锁 执行打印代码。注意:如果printString方法没有执行wait,就会出发死锁,该线程持有锁后就无限while,其他线程获取不到锁,initString也执行不了。还有如果synchronized 去掉的话 上面的代码会报错,去掉后没有锁了,notifyAll、wait找不到所,IllegalMontiorStateException
thread.join() 在当前线程执行另一个线程的thread.join()方法,会暂停当前线程,指定thread线程,当线程执行完成后在执行当前线程。
Thrad.yeald(),让出当前线程的时间,给其他线程执行。多个线程竞争执行,让出几个线程呢,这个不确定,不同的操作系统不一样。
ThreadLocal
网友评论