java 线程 在阻塞时终结 之中断讲解 ---thinking in java4

----------------------------------------------------

package org.rui.thread.concurrency;

import java.io.IOException;
import java.io.InputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

/**
 * 中断
 *
 * @author lenovo
 *
 */
class SleepBlocked implements Runnable {
	@Override
	public void run() {
		try {
			TimeUnit.SECONDS.sleep(100);
		} catch (InterruptedException e) {
			System.out.println("InterruptedException");
		}
		System.out.println("Exiting SleepBlocked.run()");
	}
}

// ////
class IOBlocked implements Runnable {

	private InputStream in;

	public IOBlocked(InputStream is) {
		in = is;
	}

	@Override
	public void run() {
		System.out.println("waiting for read();");
		try {
			in.read();
		} catch (IOException e) {
			if (Thread.currentThread().isInterrupted()) {
				System.out.println("interrupted from blocked I/O");
			} else {

			}
			e.printStackTrace();
		}

	}

}

// ////////////

class SynchronizedBlocked implements Runnable {

	public synchronized void f() {
		while (true) {//不释放锁
			Thread.yield();
		}
	}

	public SynchronizedBlocked() {
		new Thread() {
			public void run() {
				f();// 这个线程锁了
			}
		}.start();
	}

	@Override
	public void run() {
		System.out.println("试图调用f()");
		f();
		System.out.println("exiting synchroniedBlocked .run()");
	}
}

// -------------------------------------------
public class Interrupting {
	private static ExecutorService exe = Executors.newCachedThreadPool();

	static void test(Runnable r) throws InterruptedException {
		Future<?> f = exe.submit(r);
		TimeUnit.MILLISECONDS.sleep(100);
		System.out.println("interrupting:" + r.getClass().getName());
		f.cancel(true);// intrrupts if running
		System.out.println("interrupt sent to " + r.getClass().getName());
	}

	public static void main(String[] args ) throws InterruptedException{
		test(new SleepBlocked());
		System.out.println("-----------------------");
		test(new IOBlocked(System.in));
		System.out.println("-----------------------");
		test(new SynchronizedBlocked());
		System.out.println("-----------------------");
		TimeUnit.MILLISECONDS.sleep(3);
		System.out.println("aborting with system.exit(0)");
		System.exit(0);//since last 2 interrupts failed
	}

}
/**
 * output:
interrupting:org.rui.thread.concurrency.SleepBlocked
interrupt sent to org.rui.thread.concurrency.SleepBlocked
InterruptedException
-----------------------
Exiting SleepBlocked.run()
waiting for read();
interrupting:org.rui.thread.concurrency.IOBlocked
interrupt sent to org.rui.thread.concurrency.IOBlocked
-----------------------
试图调用f()
interrupting:org.rui.thread.concurrency.SynchronizedBlocked
interrupt sent to org.rui.thread.concurrency.SynchronizedBlocked
-----------------------
aborting with system.exit(0)

 */

package org.rui.thread.concurrency;

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;

/**
 * 关闭任务在其上发生阻塞的底层资源
 *
 * @author lenovo
 *
 */
public class CloseResource {
	public static void main(String[] args) throws Exception {
		ExecutorService exec = Executors.newCachedThreadPool();
		ServerSocket server = new ServerSocket(8080);
		InputStream is = new Socket("localhost", 8080).getInputStream();
		exec.execute(new IOBlocked(is));
		exec.execute(new IOBlocked(System.in));
		TimeUnit.MILLISECONDS.sleep(100);
		System.out.println("shutting down all threads");
		exec.shutdownNow();
		TimeUnit.MILLISECONDS.sleep(1);
		System.out.println("closing " + is.getClass().getName());
		is.close();// releases blocked thread

		TimeUnit.MILLISECONDS.sleep(1);
		System.out.println("closing " + System.in.getClass().getName());
		System.in.close();// releases blocked thread
	}

}

package org.rui.thread.concurrency;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketOption;
import java.nio.ByteBuffer;
import java.nio.channels.AsynchronousCloseException;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.SocketChannel;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;

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

class NIOBlocked implements Runnable {
	private final SocketChannel sc;

	public NIOBlocked(SocketChannel sc) {
		this.sc = sc;
	}

	@Override
	public void run() {
		System.out.println("waiting for read:" + this);
		try {
			sc.read(ByteBuffer.allocate(1));
		} catch (ClosedByInterruptException e) {
			System.out.println("ClosedByInterruptException");
		} catch (AsynchronousCloseException e) {
			System.out.println("AsynchronousCloseException");
		} catch (IOException e) {
			e.printStackTrace();
		}

		System.out.println("exiting nioblocked.run() " + this);
	}

}

public class NIOInterruption {
	public static void main(String[] args) throws IOException,
			InterruptedException {
		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.MILLISECONDS.sleep(1);
		//通过取消产生一个中断
		f.cancel(true);
		TimeUnit.MILLISECONDS.sleep(1);
		//release the block by closing the channel 释放块通过关闭通道
		sc2.close();

	}
}
/**
 * output:
waiting for read:[email protected]
waiting for read:[email protected]
ClosedByInterruptException
exiting nioblocked.run() [email protected]
AsynchronousCloseException
exiting nioblocked.run() [email protected]

*/

时间: 2024-10-13 11:47:03

java 线程 在阻塞时终结 之中断讲解 ---thinking in java4的相关文章

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.co

(转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()

为了解决对共享存储区的访问冲突,Java 引入了同步机制.但显然不够,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个. 为解决访问控制问题,Java 引入阻塞机制.阻塞指的是暂停一个Java线程同步的执行以等待某个条件发生(如某资源就绪). sleep():允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 时 间,指定的时间一过,线程重新进入可执行状态.典型地,sleep() 被用在等待某个资源就绪的情

java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类

java线程的阻塞和激活方法

阻塞: synchronized(this){     this.wait(10_000);     } 激活: synchronized(this){     this.notify();     }

如何中断JAVA线程

一些轻率的家伙可能被另一种方法Thread.interrupt所迷惑.尽管,其名称似乎在暗示着什么,然而,这种方法并不会中断一个正在运行的线程(待会将进一步说明),正如Listing A中描述的那样.它创建了一个线程,并且试图使用Thread.interrupt方法停止该线程.Thread.sleep()方法的调用,为线程的初始化和中止提供了充裕的时间.线程本身并不参与任何有用的操作. class Example1 extends Thread {             boolean sto

停止Java线程,小心interrupt()方法

程序是很简易的.然而,在编程人员面前,多线程呈现出了一组新的难题,如果没有被恰当的解决,将导致意外的行为以及细微的.难以发现的错误. 在本篇文章中,我们针对这些难题之一:如何中断一个正在运行的线程. 背景     中断(Interrupt)一个线程意味着在该线程完成任务之前停止其正在进行的一切,有效地中止其当前的操作.线程是死亡.还是等待新的任务或是继续运行至下一步,就取决于这个程序.虽然初次看来它可能显得简单,但是,你必须进行一些预警以实现期望的结果.你最好还是牢记以下的几点告诫. 首先,忘掉

java线程管理

java线程管理 参见: http://harmony.apache.org/subcomponents/drlvm/TM.html 1. 修订历史 2. 关于本文档 2.1. 目的 2.2. 面向的读者 2.3. 文档约定 2.4. 文档使用 3. 概览 3.1. 主要特点 3.2. VM中的线程管理器 3.3. 可移植性 4. 体系结构 4.1. 对外接口 4.1.1. Native 接口 4.1.2. Java* 接口 4.2. 数据结构 4.3. 线程控制结构 4.3.1.Native

Java线程死锁解决方法(转)

转自:http://leowzy.iteye.com/blog/740859 Java线程死锁如何避免这一悲剧  Java线程死锁需要如何解决,这个问题一直在我们不断的使用中需要只有不断的关键.不幸的是,使用上锁会带来其他问题.让我们来看一些常见问题以及相应的解决方法: Java线程死锁 Java线程死锁是一个经典的多线程问题,因为不同的线程都在等待那些根本不可能被释放的锁,从而导致所有的工作都无法完成.假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭.他们都需要获得两个锁:共享

Java线程阻塞中断和LockSupport的常见问题

上周五和周末,工作忙里偷闲,在看java cocurrent中也顺便再温故了一下Thread.interrupt和java 5之后的LockSupport的实现. 在介绍之前,先抛几个问题. Thread.interrupt()方法和InterruptedException异常的关系?是由interrupt触发产生了InterruptedException异常? Thread.interrupt()会中断线程什么状态的工作? RUNNING or BLOCKING? 一般Thread编程需要关注