java实现golang类似的chan

时间:2025-03-08 09:24:49
class ChanMessage<T> { private String type; private T data; public ChanMessage(String type, T data) { this.type = type; this.data = data; } public String getType() { return type; } public void setType(String type) { this.type = type; } public T getData() { return data; } public void setData(T data) { this.data = data; } } public class Chan<T extends ChanMessage> { private T message; private boolean empty = true; public synchronized T take() { while (empty) { try { wait(); } catch (InterruptedException e) { } } empty = true; notifyAll(); return message; } public synchronized void put(T message) { while (!empty) { try { wait(); } catch (InterruptedException e) { } } empty = false; this.message = message; notifyAll(); } public static void main(String[] args) { Chan<ChanMessage<Integer>> chanMessageChan = new Chan<>(); new Thread(() -> { chanMessageChan.put(new ChanMessage<>("timeout", new Integer(1))); }).start(); new Thread(() -> { ChanMessage<Integer> chanMessage = chanMessageChan.take(); switch (chanMessage.getType()) { case "timeout": System.out.println(chanMessage.getData()); break; default: break; } }).start(); } }