Java开发——39.多线程_(线程通信)

进程:系统分配资源的单位;
线程:处理器任务调度和执行的单位,线程之间共享进程资源。

线程通信:

解释:(A和B通电话,A需要打给B,B接听,A讲,B听;B讲,A听…)
我们在之前接触到的都是多个线程抢占CPU,谁抢到谁先执行,线程通信就是实现多个线程之间的通信,线程A执行,阻塞;线程B执行,阻塞,线程A执行,阻塞;线程B…

在这里插入图片描述

学习方法:

wait():线程阻塞,调用该方法的同时会释放同步监视器()
notify():唤醒被wait的线程,但是只唤醒一个线程(优先唤醒优先级高的线程)
notifyAll():唤醒所有被wait的线程。
​
注意:
wait()notify()以及notifyAll()方法都是声明在Object类中的
只能在同步代码块/同步方法中使用,必须保证和同步监视器的对象相同。

面试题:wait()和sleep()的区别?

1.声明位置不同:

wait()声明在Object类中
sleep()声明在Thread类中

2.作用范围不同:

wait()只能声明在同步代码块/同步方法中
sleep()声明位置比较随意

3.释放同步监视器:

wait()在方法阻塞后会自动释放同步监视器
sleep()在方法阻塞后不会自动释放同步监视器

自动释放锁的操作:

1.当前线程的同步方法、同步代码块执行结束;Lock锁,需要手动调用unlock()才能释锁;
2.当前线程在同步代码块、同步方法中遇到break、return终止了该代码块/ 该方法的继续执行;
3.当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束;
4.当前线程在同步代码块、同步方法中执行了线程对象的wait()方法,当前线 程暂停,并释放锁。

不会自动释放锁的操作:

1.线程执行同步代码块或同步方法时,程序调用Thread.sleep()、 Thread.yield()方法暂停当前线程的执行,并不会释放锁;
2.线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器);
3.应尽量避免使用suspend()和resume()来控制线程。
(suspend()和resume()是一对方法,挂起和​开始。)

方法演示:

/**
* 线程1和线程2交替输出100个数字
*/
public class Demo {public static void main(String[] args) {Number number = new Number();Thread thread01 = new Thread(number);
        Thread thread02 = new Thread(number);
​
        thread01.setName("线程01");
        thread02.setName("线程02");
​
        thread01.start();
        thread02.start();}}class Number implements Runnable{private int num = 1;
    Object obj = new Object();@Override
    public void run() {while (true) {
            synchronized (obj) {
//                synchronized (this) {
//如果此处的锁为this则下面执行的线程唤醒都应该为this.notify()/this.wait()或者省略this
                obj.notify();if (num <= 100) {
                    System.out.println(Thread.currentThread().getName() + ":" + num);
                    num ++;try {
                        obj.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }}else {
                    break;
                }}
        }}
}

欢迎关注微信公众号:小红的成长日记,一起学Java!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现多个客户端同时连接服务器进行通信,可以使用Java多线程线程池的概念。以下是一个示例代码: 服务器端代码: ```java import java.io.*; import java.net.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(12345); ExecutorService executorService = Executors.newFixedThreadPool(10); while (true) { System.out.println("服务器等待建立连接..."); Socket socket = serverSocket.accept(); // 每次有客户端建立连接就创建一个新的线程处理 executorService.execute(new ClientHandler(socket)); System.out.println("连接成功!"); } } } class ClientHandler implements Runnable { private Socket socket; public ClientHandler(Socket socket) { this.socket = socket; } @Override public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); String line; while ((line = br.readLine()) != null) { System.out.println("接收到客户端消息:" + line); // 处理客户端发送的消息 bw.write("服务器收到消息:" + line); bw.newLine(); bw.flush(); } br.close(); bw.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 客户端代码: ```java import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("服务器IP地址", 12345); BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); // 发送消息给服务器 bw.write("Hello, Server!"); bw.newLine(); bw.flush(); // 接收服务器的响应 String response = br.readLine(); System.out.println("服务器响应:" + response); br.close(); bw.close(); socket.close(); } } ``` 在服务器端代码中,通过创建一个线程池(这里使用固定大小的线程池),每当有一个客户端连接时,就创建一个新线程去处理客户端的请求。该线程负责与客户端进行通信。 在客户端代码中,创建一个Socket对象与服务器建立连接,然后通过输入输出流进行通信。在示例中,客户端向服务器发送一条消息,服务器接收到后处理,然后返回响应给客户端。 这样,多个客户端可以同时连接服务器进行通信,服务器通过多线程来处理每个客户端的请求,并保证线程安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值