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

  • Post author:
  • Post category:java


阻塞的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/ …