at java.base/java.lang.Thread.run(Thread.java:829)
时间: 2024-05-31 22:12:53 浏览: 187
这是Java程序中的一个线程在运行时发生异常而终止的信息。 java.base是Java的基本库,java.lang.Thread是Java中的线程类,run()是线程类中的一个方法,829是该方法在Java基本库中的行号。从这个信息来看,很难确定实际的问题是什么,需要查看更多的代码和异常信息来确定具体的问题。
相关问题
Exception in thread "饿汉1" java.lang.IllegalMonitorStateException: current thread is not owner at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:338) at com.itheima.d7_thread_communication.Desk.get(Desk.java:33) at com.itheima.d7_thread_communication.ThreadTest.lambda$main$3(ThreadTest.java:24) at java.base/java.lang.Thread.run(Thread.java:833) Exception in thread "饿汉2" java.lang.IllegalMonitorStateException: current thread is not owner at java.base/java.lang.Object.wait(Native Method) at java.base/java.lang.Object.wait(Object.java:338) at com.itheima.d7_thread_communication.Desk.get(Desk.java:33) at com.itheima.d7_thread_communication.ThreadTest.lambda$main$4(ThreadTest.java:27) at java.base/java.lang.Thread.run(Thread.java:833)
这个错误是 IllegalMonitorStateException,意思是当前线程不是锁的拥有者,不能进行wait或notify操作。在你的代码中,线程在 Desk 类的 get() 方法中调用了 wait() 方法,但是没有先获取锁,因此抛出了该异常。
要解决这个问题,你需要在调用 wait() 方法之前先获取锁,可以使用 synchronized 关键字来实现。在 Desk 类的 get() 方法中,将 wait() 方法调用放在一个 synchronized 块中,如下所示:
```
public synchronized void get() {
while (flag == false) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("取走:" + this.name + "-" + this.sex);
flag = false;
notify();
}
```
这样,当线程调用 get() 方法时,会先获取 Desk 对象的锁,然后再调用 wait() 方法等待。当其他线程调用 put() 方法并修改了 flag 值后,会调用 notify() 方法唤醒等待的线程。唤醒后,该线程会重新尝试获取锁并继续执行代码。
Exception in thread "Thread-1" java.lang.IllegalStateException: Scanner closed at java.base/java.util.Scanner.ensureOpen(Scanner.java:1150) at java.base/java.util.Scanner.next(Scanner.java:1573) at java.base/java.util.Scanner.nextInt(Scanner.java:2258) at java.base/java.util.Scanner.nextInt(Scanner.java:2212) at my_project/myproject.Client.lambda$1(Client.java:52) at java.base/java.lang.Thread.run(Thread.java:833) java.net.SocketException: Socket closed at java.base/sun.nio.ch.NioSocketImpl.endRead(NioSocketImpl.java:248) at java.base/sun.nio.ch.NioSocketImpl.implRead(NioSocketImpl.java:327) at java.base/sun.nio.ch.NioSocketImpl.read(NioSocketImpl.java:350) at java.base/sun.nio.ch.NioSocketImpl$1.read(NioSocketImpl.java:803) at java.base/java.net.Socket$SocketInputStream.read(Socket.java:966) at java.base/java.io.InputStream.read(InputStream.java:218) at my_project/myproject.Client.lambda$0(Client.java:33) at java.base/java.lang.Thread.run(Thread.java:833)
这个错误是由于在客户端代码中的线程,Scanner对象被关闭导致的。为了解决这个问题,你可以将Scanner对象的创建和关闭操作移到主线程中。下面是修改后的代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private static final String SERVER_IP = "localhost";
private static final int SERVER_PORT = 8888;
private String username;
public void start() {
try {
Socket socket = new Socket(SERVER_IP, SERVER_PORT);
System.out.println("成功连接服务器");
InputStream inputStream = socket.getInputStream();
OutputStream outputStream = socket.getOutputStream();
// 发送消息给服务器
new Thread(() -> {
try {
Scanner scanner = new Scanner(System.in);
while (true) {
String message = scanner.nextLine();
outputStream.write(message.getBytes());
outputStream.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
}).start();
// 接收服务器发送的消息
try {
byte[] buffer = new byte[1024];
int len;
while ((len = inputStream.read(buffer)) > 0) {
String message = new String(buffer, 0, len);
System.out.println("收到服务器消息:" + message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
socket.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Client client = new Client();
client.start();
}
}
```
在修改后的代码中,我们将接收服务器发送消息的逻辑移到了主线程中,并在最后关闭了Socket连接。这样就避免了在子线程中关闭Scanner对象和Socket连接的问题。