标签:代码 wait 代码块 check 同步代码块 throws new t row cat
public class InterruptDemo { public static void main(String[] args) throws InterruptedException{ Thread t1 = new Thread(){ public void run(){ while (true){ System.out.println("线程执行"); if(Thread.currentThread().isInterrupted()){ System.out.println("线程被中断执行"); break; } try{ Thread.sleep(3000); }catch (InterruptedException e){ System.out.println("线程出现异常"); //如果抛异常,会清除中断标记 再次设置中断 Thread.currentThread().interrupt(); } //使线程从执行状态到就绪状态 Thread.yield(); } } }; t1.start(); Thread.sleep(3000); /* 保证线程可见性 private volatile Interruptible blocker; private final Object blockerLock = new Object(); public void interrupt() { if (this != Thread.currentThread()) checkAccess(); //使用同步代码块 synchronized (blockerLock) { Interruptible b = blocker; if (b != null) { interrupt0(); // Just to set the interrupt flag b.interrupt(this); return; } } //private native void interrupt0(); interrupt0(); } */ t1.interrupt(); } }
public class WaitDemo {
private final static Object object = new Object();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(object){
System.out.println(Thread.currentThread().getName() + "等待的时间开始:" + System.currentTimeMillis());
System.out.println("执行1:" + Thread.currentThread().getName());
try{
//wait方法会释放目标对象的锁
object.wait();
}catch (InterruptedException e){
System.out.println("异常1:" + e.getMessage());
}
System.out.println(Thread.currentThread().getName() + "等待的时间结束:" + System.currentTimeMillis());
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized(object){
System.out.println(Thread.currentThread().getName() + "等待的时间开始:" + System.currentTimeMillis());
System.out.println("执行2:" + Thread.currentThread().getName());
//唤醒所有等待的线程
//object.notifyAll();
//唤醒等待的线程 随机唤醒一个
object.notify();
try{
Thread.sleep(2000);
}catch (InterruptedException e){
System.out.println("异常2:" + e.getMessage());
}
System.out.println(Thread.currentThread().getName() + "等待的时间结束:" + System.currentTimeMillis());
}
}
});
public static void main(String[] args){
WaitDemo wd = new WaitDemo();
//两个线程执行的顺序是随机的,原因是多个线程会进行指令重排
wd.t1.start();
wd.t2.start();
}
}
标签:代码 wait 代码块 check 同步代码块 throws new t row cat
原文地址:https://www.cnblogs.com/mutong1228/p/10559199.html