㈠ 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();
}
}
㈡ java 提供了哪些IO方式
Java IO 方式有很多種,基於不同的 IO 抽象模型和交互方式,可以進行簡單區分。
首先,傳統的 java.io 包,它基於流模型實現,提供了我們最熟知的一些 IO 功能,比如 File 抽象、輸入輸出流等。交互方式是同步、阻塞的方式,也就是說,在讀取輸入流或者寫入輸出流時,在讀、寫動作完成之前,線程會一直阻塞在那裡,它們之間的調用是可靠的線性順序。
java.io 包的好處是代碼比較簡單、直觀,缺點則是 IO 效率和擴展性存在局限性,容易成為應用性能的瓶頸。
很多時候,人們也把 java.net 下面提供的部分網路 API,比如 Socket、ServerSocket、HttpURLConnection 也歸類到同步阻塞 IO 類庫,因為網路通信同樣是 IO 行為。
第二,在 Java 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以構建多路復用的、同步非阻塞 IO 程序,同時提供了更接近操作系統底層的高性能數據操作方式。
第三,在 Java 7 中,NIO 有了進一步的改進,也就是 NIO 2,引入了非同步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。非同步 IO 操作基於事件和回調機制,可以簡單理解為,應用操作直接返回,而不會阻塞在那裡,當後台處理完成,操作系統會通知相應線程進行後續工作。
㈢ java中IO阻塞時線程處於什麼狀態
Java中線程有4種狀態: RUNNABLE, BLOCKED, WAITING, TIMED_WAITING
當一個線程運行至 Inputstream.read()發生阻塞時,線程處於RUNNABLE。
㈣ java中的阻塞什麼意思
你說的應該是線程的阻塞狀態吧,從這個詞的意思來講,阻塞指的是暫停一個線程的執行以等待某個條件發生,那在java中如果要主動實現這種狀態可以調用線程的sleep方法或者wait方法等。
㈤ java怎麼寫阻塞式io流,阻塞與非阻塞在寫法上有區別嗎
首先要明白什麼是「阻塞」?
阻塞實際是針對「當前」線程的一個概念,當前線程可以往下走,就是沒有阻塞,否則就可以說當前線程被阻塞了。
明白了概念就好處理了:
非阻塞:new Thread(){ public void run(){ /* 我的IO處理*/ } }.start()
阻塞:aInputStream.read()這樣就可以了。最簡單的驗證:在main方法中加入這句「System.in.read();」看看你的程序是不是停在這句了?除非你在控制台輸入東西,否則你的程序就「阻塞」在這里了。
㈥ JAVA怎麼中斷IO阻塞的線程
1、寫程序的關鍵是要有控制流,當程序塊中的處理涉及到死循環的時候更要加量的控制。
2、像這種情況,兩個步驟,
一,為IO時的創建線程,加一個數量的閾值,超過它後則不再創建。
二,為每個線程設置標志變數標志該線程是否已經束,或是直接加入線程組去管理。
3、回看你的程序需求,明顯設計不合理。其實應當創建一個線程池去搞定這個業務需求。
再想想吧。
㈦ java的io流,對於阻塞來說,讀和寫都是阻塞的嗎,還是只有讀時候是阻塞的。
必須讀和寫都是阻塞,防止讀入臟數據
㈧ java怎麼寫阻塞式io流,阻塞與非阻塞在寫法上的有什麼區別求大神
首先要明白什麼是「阻塞」?
阻塞實際是針對「當前」線程的一個概念,當前線程可以往下走,就是沒有阻塞,否則就可以說當前線程被阻塞了。
明白了概念就好處理了:
非阻塞:new Thread(){ public void run(){ /* 我的IO處理*/ } }.start()
阻塞:aInputStream.read()這樣就可以了。最簡單的驗證:在main方法中加入這句「System.in.read();」看看你的程序是不是停在這句了?除非你在控制台輸入東西,否則你的程序就「阻塞」在這里了。
㈨ 什麼是阻塞式和非阻塞io流
阻塞IO:socket 的阻塞模式意味著必須要做完IO 操作(包括錯誤)才會返回。
非阻塞IO:非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功。
㈩ Java:什麼叫做同步非阻塞IO呢
這個IO不用等待對方返回結果,打開IO指令執行完成後,會繼續執行指令後面的操作,當對方返回數據後會出發一個事件,告訴你數據回來了,例如使用selector的非阻塞IO.你應當看看java.nio.