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(); }catch (InterruptedException e){
System.out.println("线程出现异常");
//如果抛异常,会清除中断标记 再次设置中断
Thread.currentThread().interrupt();
}
//使线程从执行状态到就绪状态
Thread.yield();
}
}
};
t1.start();
Thread.sleep();
/*
保证线程可见性
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();
}
}
 

线程interrupt和wait的更多相关文章

  1. “全栈2019”Java多线程第六章:中断线程interrupt()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  2. 中断线程Interrupt()

    以下是参考<<Java多线程模式>>的 1. sleep() & interrupt() 线程A正在使用sleep()暂停着: Thread.sleep(100000) ...

  3. Java 学习笔记之 线程interrupt方法

    线程interrupt方法: interrupt方法是用来停止线程的,但是他的使用效果并不像for+break那样,马上就停止循环. 调用interrupt()其实仅仅是在当前线程中打了一个停止标记, ...

  4. Java线程--interrupt join yield setDaemon常用方法的使用

    概念: 操作系统可以有多个进程,一个线程可以有一个或多个线程.进程与进程之间不共享内存,都在各自的空间中运行.而线程不仅可以共享内存,还可以用有一个自己的内存空间,叫做线程栈. 线程又称轻量级进程.J ...

  5. java线程interrupt、interrupted 、isInterrupted区别

    前言 在分析interrupt之前,应该先了解java里线程有5种状态,其中有一个阻塞状态,interrupt和阻塞有关. interrupt() 方法 作用于要中断的那个线程. interrupt( ...

  6. Java多线程(五)停止线程 interrupt

    调用interrupt方法仅仅是在当前线程中打了一个停止的标记,并不是真正停止线程. this.interrupted() :测试当前线程是否已经中断,执行后具有将状态标志清除为false的功能 is ...

  7. 并发和多线程(二)--启动和中断线程(Interrupt)的正确姿势

    启动线程: 从一个最基本的面试题开始,启动线程到底是start()还是run()? Runnable runnable = () -> System.out.println(Thread.cur ...

  8. java多线程系类:基础篇:09之interrupt()和线程终止方式

    概要 本章,会对线程的interrupt()中断和终止方式进行介绍.涉及到的内容包括:1. interrupt()说明2. 终止线程的方式2.1 终止处于"阻塞状态"的线程2.2 ...

  9. Java 并发:线程中断-interrupt

    一直以为执行了interrupt方法就可以让线程结束,并抛出InterruptedException. 今天看了Java并发编程实战的第七章发现并不是这么回事,在这章的开头就提到 要使任务和线程能安全 ...

随机推荐

  1. python3 os模块

    os模块就是对操作系统进行操作,这个模块提供了一种使用操作系统相关功能的可移植方式.1.系统信息 posix.uname_result(sysname='Linux', nodename='liang ...

  2. Duplicate entry '0' for key 'PRIMARY'

    一般使用ORM时,提交新增实体时, mysql会出现此错误:Duplicate entry '0' for key 'PRIMARY' 原因是插入语句,未提供主键的值,且主键是非自增长的. 解决办法是 ...

  3. 小程序实践(五):for循环绑定item的点击事件

    微信展示列表效果借助于 wx:for  简单写一个列表(wxml文件中): 对应的数据源(js文件中): 写一个点击监听: 效果: 以上.可以实现列表的item点击效果,但是无法到点击的item对应的 ...

  4. windows网络编程中文 笔记(一)

    OSI网络模型 OSI(Open System Interconnection)开放系统互联 第七层 应用层 为用户提供相应的界面,以便使用提供的连网功能 第六层 表示层 完成数据的格式化 第五层 会 ...

  5. Python之__new__方法

    # -*- coding: utf-8 -*- """ Created on Sun Dec 2 11:03:03 2018 Python类构造过程 @author: z ...

  6. MS SQL CASE WHEN 的用法

    前言 由于经常使用 case when 的2种情况方式,如果=1 则*** 否则 *** 结束.久而久之,都以为只能这么用,都忘记了Case WHEN 的用法. 示例   ,              ...

  7. web前端(4)—— 常用标签1

    标题标签h1~h6 顾名思义,这些就是把字体设置为大字体的,就如博客园的这个编辑器里的格式: 不信的话我们自己设置看看:好的,从本篇文章开始,我们需要动手了 <!DOCTYPE html> ...

  8. redmine screenshot paste(粘贴截图)

    前言 本文所使用的 redmine 3.1.x 查看redmine版本:以管理员帐号登录 – 点 管理 – 点 信息,示例如下: 在线插件库 插件仓库,可以下载丰富的插件: http://www.re ...

  9. python 进程池的简单使用方法

    回到python,用一下python的进程池. 记得之前面试的时候,面试官问:你知道进程池的默认参数吗? 我没有回答上来,后来才知道,是有默认参数的.下面就看看它的默认参数 1. 不加参数 from ...

  10. [Hive_5] Hive 的 JDBC 编程

    0. 说明 Hive 的 JDBC 编程 1. hiveserver2 介绍 hiveserver2 是 Hive 的 JDBC 接口,用户可以连接此端口来连接 Hive 服务器 JDBC 驱动类为 ...