小编asm*_*smb的帖子

使用AutoCloseable关闭多个资源(尝试使用资源)

我知道,如果资源实现了AutoCloseable,那么您通过try传递的资源将自动关闭.到现在为止还挺好.但是当我有几个我希望自动关闭的资源时,该怎么办?套接字示例;

try (Socket socket = new Socket()) {
    input = new DataInputStream(socket.getInputStream());
    output = new DataOutputStream(socket.getOutputStream());
} catch (IOException e) {
} 
Run Code Online (Sandbox Code Playgroud)

所以我知道套接字将被正确关闭,因为它在try中作为参数传递,但输入和输出应如何正确关闭?

java sockets datainputstream try-with-resources autocloseable

54
推荐指数
3
解决办法
5万
查看次数

一些线程卡在semaphore.aquire()(threads/semaphore/countdownlatch)

我创建了一个小型电影租赁模拟程序.以下是它的工作原理: - 主线程允许用户输入客户名称

  • 每个输入的客户都会启动一个新线程(Customer Runnable)
  • 当创建了5个客户时,租赁服务开始(等待5个倒计时)
  • 当客户运行()时,他们将首先尝试从信号量(具有5个可用许可证)获取()许可证
  • 如果他们获得许可,他们将等待1-10秒,然后租一辆车,然后等待1-3秒,然后开车
  • 当汽车被解除时,他们将全程开始循环迭代并尝试获得新的许可

所以这似乎工作得很好; 它适用于添加的前5个客户.在5号之后添加的客户似乎卡在semaphore.aquire()等待,我无法理解为什么,所以我在这里问.所有的帮助将非常赞赏:)

App.java:

import java.lang.System;import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

public class App {

    public static CountDownLatch latch = new CountDownLatch(5);
    public static Executor executor = Executors.newCachedThreadPool();
    public static Store store = new Store();
    public static Semaphore semaphore = new Semaphore(Store.getMovies().size());

    Scanner in;

    public App() {
        in = new Scanner(System.in);

        while (true) {
            executor.execute(new Customer(in.nextLine()));
        }
    }

    public static void main(String[] args) {
        new App(); …
Run Code Online (Sandbox Code Playgroud)

java multithreading semaphore countdownlatch

2
推荐指数
1
解决办法
964
查看次数