導航:首頁 > 編程語言 > java阻塞io

java阻塞io

發布時間:2022-05-09 01:38:37

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流

  1. 阻塞IO:socket 的阻塞模式意味著必須要做完IO 操作(包括錯誤)才會返回。

  2. 非阻塞IO:非阻塞模式下無論操作是否完成都會立刻返回,需要通過其他方式來判斷具體操作是否成功。

㈩ Java:什麼叫做同步非阻塞IO呢

這個IO不用等待對方返回結果,打開IO指令執行完成後,會繼續執行指令後面的操作,當對方返回數據後會出發一個事件,告訴你數據回來了,例如使用selector的非阻塞IO.你應當看看java.nio.

閱讀全文

與java阻塞io相關的資料

熱點內容
cad最下面的一排命令都什麼意思 瀏覽:456
pythonimportcpp 瀏覽:850
W10的系統怎麼給U盤加密 瀏覽:370
華為手機代碼編程教學入門 瀏覽:762
和彩雲沒會員怎樣解壓 瀏覽:634
androidimageview保存 瀏覽:387
新買店鋪什麼伺服器 瀏覽:883
文件夾能直接刻錄嗎 瀏覽:493
androidxmpp刪除好友 瀏覽:969
javac哪個前景好 瀏覽:427
中華英才網app為什麼不能搜索了 瀏覽:660
伺服器域名是什麼意思 瀏覽:52
Linux導出mysql命令 瀏覽:159
無詐建鄴是什麼app 瀏覽:228
python中的雙色球 瀏覽:166
python解釋器里如何換行 瀏覽:411
python編寫格式 瀏覽:575
用python做出來的軟體 瀏覽:469
伺服器指示燈代表什麼 瀏覽:702
做一個單片機銷售需要知識 瀏覽:777