java怎么中断阻塞状态,Java多线程之阻塞I/O如何中断

阻塞的I/O线程在关闭线程时并不会被打断,需要关闭资源才能打断。

1.执行socketInput.close();阻塞可中断。

2.执行System.in.close();阻塞没有中断。

package Thread.Interrupting;

import java.io.IOException;

import java.io.InputStream;

import java.net.ServerSocket;

import java.net.Socket;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.TimeUnit;

public class CloseResource {

public static void main(String[] args) throws Exception {

//堵塞的I/O线程不会被打断,需要关闭资源才能打断

ExecutorService exec = Executors.newCachedThreadPool();

ServerSocket server = new ServerSocket(8080);

InputStream socketInput = new Socket("localhost", 8080)

.getInputStream();

exec.execute(new IOBlocked(socketInput));

exec.execute(new IOBlocked(System.in));

TimeUnit.MILLISECONDS.sleep(100);

System.out.println("Shutting down all threads");

exec.shutdownNow();

TimeUnit.SECONDS.sleep(1);

System.out.println("Closing " + socketInput.getClass().getName());

socketInput.close();

TimeUnit.SECONDS.sleep(1);

System.out.println("Close " + System.in.getClass().getName());

System.in.close();

}

}

被阻塞的nio通道在关闭线程后会自动响应中断阻塞,不需要关闭底层资源。

package Thread.Interrupting;

import java.io.IOException;

import java.net.InetSocketAddress;

import java.net.ServerSocket;

import java.nio.ByteBuffer;

import java.nio.channels.AsynchronousCloseException;

import java.nio.channels.ClosedByInterruptException;

import java.nio.channels.SocketChannel;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import java.util.concurrent.Future;

import java.util.concurrent.TimeUnit;

class NIOBlocked implements Runnable {

private final SocketChannel sc;

public NIOBlocked(SocketChannel sc) {

this.sc = sc;

}

@Override

public void run() {

try {

System.out.println("Waiting for read() in " + this);

sc.read(ByteBuffer.allocate(1));

} catch (ClosedByInterruptException e) {

System.out.println("ClosedByInterruptException");

} catch (AsynchronousCloseException e) {

System.out.println("AsynchronousCloseException");

} catch (IOException e) {

throw new RuntimeException(e);

}

System.out.println("Exiting NIOBlocked.run() " + this);

}

}

public class NIOInterruption {

public static void main(String[] args) throws Exception {

//被阻塞的nio通道会自动地响应中断

ExecutorService exec = Executors.newCachedThreadPool();

ServerSocket server = new ServerSocket(8080);

InetSocketAddress isa = new InetSocketAddress("localhost", 8080);

SocketChannel sc1 = SocketChannel.open(isa);

SocketChannel sc2 = SocketChannel.open(isa);

Future> f = exec.submit(new NIOBlocked(sc1));

exec.execute(new NIOBlocked(sc2));

exec.shutdown();

TimeUnit.SECONDS.sleep(1);

f.cancel(true);

TimeUnit.SECONDS.sleep(1);

sc2.close();

}

}

“全栈2019”Java多线程第三十一章:中断正在等待显式锁的线程

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

Java多线程——可阻塞的队列BlockingQueue

阻塞队列与Semaphore有些相似,但也不同,阻塞队列是一方存放数据,另一方释放数据,Semaphore通常则是由同一方设置和释放信号量. ArrayBlockingQueue 只有put方法和ta ...

Java多线程系列 基础篇04 线程中断

1. 中断线程 中断可以理解为线程的一个标志位属性,它表示一个运行中的线程是否被其他线程进行了中断操作,其他线程通过调用该线程的interrupt()方法对其进行中断操作,线程通过检查自身是否被中断来 ...

Java多线程_阻塞队列

1.什么是阻塞队列       我们知道,PriorityQueue.LinkedList这些都是非阻塞队列.在我们使用非阻塞队列的时候有一个很大问题,它不会对当前线程产生阻塞,那么在面对类似消费者- ...

Java多线程_JUC包下的阻塞队列

在前面我们提到了阻塞队列,也用过了LinkedBolckingQueue队列了,在这里,我们主要对 ArrayBlockingQueue,PriorityBlockingQueue,DelayQueu ...

“全栈2019”Java多线程第三十章:尝试获取锁tryLock()方法详解

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

java多线程系列笔记 目录

基础篇 Java多线程系列 基础篇01 线程的状态 Java多线程系列 基础篇02 线程的创建和运行 Java多线程系列 基础篇03 线程的优先级和守护线程 Java多线程系列 基础篇04 线程中断 ...

Java多线程:队列与阻塞队列

1. 什么是阻塞队列 阻塞队列(BlockingQueue)是 Java 5 并发新特性中的内容,阻塞队列的接口是 java.util.concurrent.BlockingQueue,它提供了两个附 ...

JAVA多线程之中断机制(如何处理中断?)

一,介绍 这篇文章主要记录使用 interrupt() 方法中断线程,以及如何对InterruptedException进行处理.感觉对InterruptedException异常进行处理是一件谨慎且 ...

随机推荐

jQuery的开始

一.下载 jQuery http://jquery.com/download/ 二.什么是jQuery: 1.jQuery 是一个 JavaScript 库. 2.jQuery 极大地简化了 Java ...

POJ 3186 Treats for the Cows 一个简单DP

DP[i][j]表示现在开头是i物品,结尾是j物品的最大值,最后扫一遍dp[1][1]-dp[n][n]就可得到答案了 稍微想一下,就可以, #include #inc ...

Mysql explain 查看分区表

mysql> explain select * from ClientActionTrack where startTime>'2016-08-25 00:00:00' and start ...

12C RMAN 备份参考v1

windows bat 1,C:\dba\utility\rman\rman.bat del C:\dba\utility\rman\full_db_* /qset TNSNAME=ceipuatrm ...

RAC+ASM 添加控制文件

环境介绍:11g RAC 使用 ASM 磁盘组,控制文件只有一个,需要进行添加 参照 MOS 文档 How to Multiplex Control File In RAC Database (文档 ...

JAVA 二进制基础

主要内容 1.十进制二进制互转 2.二进制的位运算 3.JDK内置的进制转换 4.JAVA中的进制 十进制二进制互转 57 111001 二进制的位运算:优点:特定情况下,计算方便,被支持面广泛. ① ...

Docker系统五:Docker仓库

创建Docker Hub账户 登录和上传镜像到Hub.docker.com docker login //登陆hub.docker.com docker tag ubutun1404-baseimag ...

[转] vue&webpack多页面配置

前言 最近由于项目需求,选择使用vue框架,webpack打包直接使用的vue-cli,因为需要多页面而vue-cli只有单页面,所以就决定修改vue-cli的配置文件来满足开发需求. html-we ...

centos6.8安装httpd后无法访问

1.打开 httpd.conf 将里面的 #ServerName localhost:80 注释去掉 2.修改SELinux状态: 1)/usr/sbin/sestatus -v      ##如果S ...

java socket之上传文件

一.功能介绍 该功能主要实现,将客户端的:F:/work/socketSample/filetemp/client/test_client.txt上传到服务端F:/work/socketSample/ ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值