您的位置:首页 > 编程语言 > Java开发

(43)21.4.3 中断---Java编程思想之并发笔记

2012-12-31 15:50 1176 查看
1. 中断的位置和要处理的资源
在Runnable.run()方法的中间打断它,当打断被阻塞的任务的时候,可能要清理资源。为了返回良好的状态,必须仔细考虑代码的执行路径,并仔细写catch子句以正确清除所有事物。
2.Thread类中的interrupt()方法,
可以用来终止任务,这个方法将设置线程的中断状态。如果一个线程已经被阻塞,或者试图执行一个阻塞的操作,那么设置这个线程的中断中断状态将抛出InterruptedException。
Thread.interrupted()提供了离开run()循环而不抛出异常的第二种方法。
3.调用interrupt()方法
为了调用interrupt()方法,必须持有Thread对象。新的concurrent类库避免使用Thread对象的操作,尽量用Executor,如果在Executor上调用shutdownNow(),那么将发送一个interrupt()调用给它启动的所有线程。这么做的意义:因为完成工程中某个部分或者整个程序时,通常希望同时关闭某个特定Executor的所有任务。
有时候希望只中断某个任务,可以使用Executor调用submit()而不是executor()来启动任务,就可以持有该任务的上下文。submit()将返回一个泛型Future<?>其中有一个未修饰的参数,因为永远都不会在其上调用get(),持有这种Future的关键在于你可以在其上调用cancel(),并因此可以使用它来中断某个特定的任务。如果将true传递给cancel(),那么它将会拥有在该线程上调用interrupt()以停止这个线程的权限。因此cancel()是一种中断由Executor启动的单个线程的方式。
4. 例1
[align=left]package jiangning;[/align]

[align=left]import java.io.IOException;[/align]
[align=left]import java.io.InputStream;[/align]
[align=left]import java.util.concurrent.ExecutorService;[/align]
[align=left]import java.util.concurrent.Executors;[/align]
[align=left]import java.util.concurrent.Future;[/align]
[align=left]import java.util.concurrent.TimeUnit;[/align]

class SleepBlocked implements Runnable{//sleep
blocked

public void run()
{
[align=left] try {[/align]
[align=left] TimeUnit. SECONDS.sleep(100);[/align]
} catch (InterruptedException
e) {
[align=left] System. out.println("InterruptedException" );[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left]}[/align]
class IOBlocked implements Runnable{//IO
blocked
[align=left] private InputStream in ;[/align]
public IOBlocked(InputStream
in){
this.in =
in;
[align=left] }[/align]
public void run()
{
[align=left] try {[/align]
System. out.println("wait
for read(): " );
[align=left] in.read();[/align]
} catch (IOException
e) {
[align=left] if(Thread.currentThread ().interrupted()){[/align]
System. out.println("Interrupted
from blocked I/O ");
[align=left] } else{[/align]
[align=left] throw new RuntimeException(e);[/align]
[align=left] }[/align]
[align=left] }[/align]
System. out.println("Exiting
IOBlock.run() " );
[align=left] }[/align]
[align=left]}[/align]

class SynchronizedBlocked implements Runnable{//synchronized
block
[align=left] public synchronized void f(){[/align]
[align=left] while(true ){[/align]
[align=left] Thread. yield();[/align]
[align=left] }[/align]
[align=left] }[/align]
[align=left] public SynchronizedBlocked(){[/align]
[align=left] new Thread(){[/align]
[align=left] public void run(){[/align]
f(); //lock
acquired by this Thread
[align=left] }[/align]
[align=left] }.start();[/align]
[align=left] }[/align]
public void run()
{
System. out.println("try
to call f()" );
[align=left] f();[/align]
System. out.println("Exiting
SynchronizedBlock.run()" );
[align=left] }[/align]
[align=left] [/align]
[align=left]}[/align]
public class Interrupteing
{
private static ExecutorService exec =
Executors.newCachedThreadPool();
static void test(Runnable
r ) throws InterruptedException{
[align=left] Future<?> f = exec.submit(r);[/align]
[align=left] TimeUnit. MILLISECONDS.sleep(100);[/align]
System. out.println("Interruping
" + r.getClass().getName());
f.cancel( true);//interrupts
if running
System. out.println("Interrupte
sent to " + r.getClass().getName());
[align=left] [/align]
[align=left] }[/align]
public static void main(String[]
args) throws Exception{
[align=left] test(new SleepBlocked());[/align]
[align=left] test(new IOBlocked(System. in));[/align]
[align=left] test(new SynchronizedBlocked());[/align]
[align=left] TimeUnit. SECONDS.sleep(3);[/align]
System. out.println("Aborting
with System.exit(0)" );
[align=left] System. exit(0);[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]/**[/align]
[align=left]Interruping jiangning .SleepBlocked[/align]
[align=left]Interrupte sent to jiangning.SleepBlocked[/align]
[align=left]InterruptedException[/align]
[align=left]wait for read():[/align]
[align=left]Interruping jiangning .IOBlocked[/align]
[align=left]Interrupte sent to jiangning.IOBlocked[/align]
[align=left]try to call f()[/align]
[align=left]Interruping jiangning .SynchronizedBlocked[/align]
[align=left]Interrupte sent to jiangning.SynchronizedBlocked[/align]
[align=left]Aborting with System.exit(0)[/align]
[align=left]*/[/align]
[align=left]5.关闭任务在其上发生阻塞的底层资源:[/align]
[align=left]例2.这个例子没有看明白???[/align]

[align=left]package jiangning;[/align]

[align=left]import java.io.InputStream;[/align]
[align=left]import java.net.ServerSocket;[/align]
[align=left]import java.net.Socket;[/align]
[align=left]import java.util.concurrent.ExecutorService;[/align]
[align=left]import java.util.concurrent.Executors;[/align]
[align=left]import java.util.concurrent.TimeUnit;[/align]

public class CloseResource
{

public static void main(String[]
args) throws Exception {
[align=left] ExecutorService exec = Executors. newCachedThreadPool();[/align]
[align=left] ServerSocket server = new ServerSocket(8080);[/align]
[align=left] InputStream sockedInput = new Socket("localhost" ,8080).getInputStream();[/align]
[align=left] exec.execute( new IOBlocked(sockedInput));[/align]
[align=left] exec.execute( new IOBlocked(System.in));[/align]
[align=left] TimeUnit. MILLISECONDS.sleep(100);[/align]
System. out.println("shutdown
all Threads" );
[align=left] exec.shutdownNow();//关闭所有线程[/align]
[align=left] TimeUnit. SECONDS.sleep(1);[/align]
System. out.println("closing
" + sockedInput.getClass().getName());
[align=left] sockedInput.close();[/align]
[align=left] TimeUnit. SECONDS.sleep(1);[/align]
System. out.println("closing
" + System.in.getClass().getName());
[align=left] System. in.close();[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]/**[/align]
[align=left]wait for read():[/align]
[align=left]wait for read():[/align]
[align=left]shutdown all Threads[/align]
[align=left]closing java.net.SocketInputStream[/align]
[align=left]Interrupted from blocked I/O[/align]
[align=left]Exiting IOBlock.run()[/align]
[align=left]closing java. io.BufferedInputStream[/align]
[align=left]*/[/align]
[align=left]分析:一旦底层资源被关闭,任务将解除阻塞。interrupt()看起来发生在关闭Socked而不是关闭System.in的时刻。[/align]

[align=left]6.例子3[/align]

[align=left]package jiangning.c21;[/align]

[align=left]import java.io.IOException;[/align]
[align=left]import java.io.InputStream;[/align]
[align=left]import java.net.InetSocketAddress;[/align]
[align=left]import java.net.ServerSocket;[/align]
[align=left]import java.net.Socket;[/align]
[align=left]import java.nio.ByteBuffer;[/align]
[align=left]import java.nio.channels.AsynchronousCloseException;[/align]
[align=left]import java.nio.channels.ClosedByInterruptException;[/align]
[align=left]import java.nio.channels.SocketChannel;[/align]
[align=left]import java.util.concurrent.ExecutorService;[/align]
[align=left]import java.util.concurrent.Executors;[/align]
[align=left]import java.util.concurrent.Future;[/align]
[align=left]import java.util.concurrent.TimeUnit;[/align]

[align=left]class NIOBlocked implements Runnable{[/align]
[align=left] private final SocketChannel sc;[/align]
public NIOBlocked(SocketChannel
sc){
this.sc =
sc;
[align=left] }[/align]
public void run()
{
[align=left] try {[/align]
System. out.println("waiting
for read() in " + this);
[align=left] sc.read(ByteBuffer. allocate(1));[/align]
} catch (ClosedByInterruptException
e) {
[align=left] System. out.println("ClosedByInterruptException" );[/align]
} catch (AsynchronousCloseException
e){
[align=left] System. out.println("AsynchronousCloseException" );[/align]
} catch (IOException
e){
[align=left] throw new RuntimeException(e);[/align]
[align=left] }[/align]
System. out.println("exiting
NIOBlocked.run()" );
[align=left] }[/align]
[align=left]}[/align]

public class NIOInterruption
{
[align=left] [/align]
public static void main(String[]
args) throws Exception {
[align=left] ExecutorService exec = Executors. newCachedThreadPool();[/align]
[align=left] ServerSocket server = new ServerSocket(8080);[/align]
[align=left] InetSocketAddress isa = new InetSocketAddress("localhost" ,8080);[/align]
[align=left] SocketChannel sc1 = SocketChannel. open(isa);[/align]
[align=left] SocketChannel sc2 = SocketChannel. open(isa);[/align]
[align=left] Future<?> f = exec.submit( new NIOBlocked(sc1));[/align]
[align=left] exec.execute( new NIOBlocked(sc2));[/align]
[align=left] exec.shutdown();[/align]
[align=left] TimeUnit. SECONDS.sleep(1);[/align]
[align=left] f.cancel( true);[/align]
[align=left] TimeUnit. SECONDS.sleep(1);[/align]
[align=left] sc2.close();[/align]
[align=left] }[/align]
[align=left]}[/align]

[align=left]/**[/align]
[align=left]waiting for read() in jiangning.c21.NIOBlocked@b0bad7[/align]
[align=left]waiting for read() in jiangning.c21.NIOBlocked@ba9340[/align]
[align=left]ClosedByInterruptException[/align]
[align=left]exiting NIOBlocked.run()[/align]
[align=left]AsynchronousCloseException[/align]
[align=left]exiting NIOBlocked.run()[/align]
[align=left]*/[/align]

[align=left]没有太看明白???[/align]

[align=left]7.被互斥所阻塞[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: