Java线程:线程交互

简介: 一、基础知识   java.lang.Object的类的三个方法:     void notify():唤醒在此对象监视器上等待的单个线程。     void notifyAll():唤醒在此对象监视器上等待的所有线程。

一、基础知识

  java.lang.Object的类的三个方法:

    void notify():唤醒在此对象监视器上等待的单个线程。

    void notifyAll():唤醒在此对象监视器上等待的所有线程。

    void wait():导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。

    void wait(long timeout):导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者是超过指定时间。

    void wait(long timeout,int nanos):导致当前线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者是其他某个线程中断当前线程,或超过某个实际时间。

以上方法使用要点:

  必须从同步环境中调用这些方法。线程不能调用对象上等待或通知的方法,除非它拥有那个对象的锁。

  以上几种方法都是Object的实例方法,与每个对象具有锁是一样的,每个对象可以有一个线程列表,它们等待来自该信号。线程通过wait()获得这个等待列表。它不再执行任何其他指令,直到调用notify()为止。如果多个线程在同一个对象上等待,则将只选择一个线程继续执行。如果没有线程等待,则不采取操作。如;

  

 1 package Thread;
 2 
 3 public class Test2 {
 4     public static void main(String[] args){
 5         ThreadB b=new ThreadB();
 6         b.start();//线程A拥有b对象上的锁。线程为了调用wait()或notify()方法,该线程必须是那个对象锁的拥有者
 7         synchronized(b){
 8             try{
 9                 System.out.println("等待对象b完成计算...>");
10                 b.wait();//当前线程A等待
11             }catch(InterruptedException e){
12                 e.printStackTrace();
13             }
14             System.out.println("b对象计算完毕,其总和是:"+b.total);
15         }
16     }
17 }    
18 class ThreadB extends Thread{
19     int total;
20     public void run(){
21         synchronized(this){
22             for(int i=0;i<101;i++){
23                 total+=i;
24             }
25             notify();//(完成计算)唤醒在此对象监视器上等待的单个线程,在本例中A被唤醒。
26         }
27     }
28 }
1 等待对象b完成计算...>
2 b对象计算完毕,其总和是:5050

  在对象上调用wait()方法时,执行该代码的线程立刻放弃它在该对象的锁,然后调用调用notify()方法,如果线程仍然在完成同步代码,则线程移出之前不会放弃锁。因此,只要调用notify()并不意味着这时的锁变得可用。

二、多个线程在等待一个对象锁时使用notifyAll()

  多数情况下,最好通知等待某个对象的所有线程。如果这样做,可以在对象上使用notifyAll()方法,让所有等待的线程返回到可运行状态。如:

 1 package Thread;
 2 
 3 public class Test2 extends Thread{    
 4     public static void main(String[] args){
 5         Calculator calculator=new Calculator();
 6         new Test2(calculator).start();
 7         new Test2(calculator).start();
 8         new Test2(calculator).start();
 9         calculator.start();//线程A拥有b对象上的锁。线程为了调用wait()或notify()方法,该线程必须是那个对象锁的拥有者        
10     }
11     Calculator calculator;
12     public Test2(Calculator calculator){
13         this.calculator=calculator;
14     }
15     public void run(){
16         synchronized(calculator){
17             try{
18                 System.out.println(Thread.currentThread()+"等待计算结果...>");
19                 calculator.wait();//当前线程A等待
20             }catch(InterruptedException e){
21                 e.printStackTrace();
22             }
23             System.out.println(Thread.currentThread()+"结果为:"+calculator.total);
24         }        
25     }
26 }    
27 class Calculator extends Thread{
28     int total;
29     public void run(){
30         synchronized(this){
31             for(int i=0;i<101;i++){
32                 total+=i;
33             }
34             notifyAll();//(完成计算)唤醒在此对象监视器上等待的单个线程,在本例中A被唤醒。
35         }
36     }
37 }
View Code
1 Thread[Thread-1,5,main]等待计算结果...>
2 Thread[Thread-3,5,main]等待计算结果...>
3 Thread[Thread-2,5,main]等待计算结果...>
4 Thread[Thread-2,5,main]结果为:5050
5 Thread[Thread-3,5,main]结果为:5050
6 Thread[Thread-1,5,main]结果为:5050
View Code

 

当神已无能为力,那便是魔渡众生
目录
相关文章
|
8天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
46 0
|
21天前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
53 16
|
29天前
|
缓存 并行计算 安全
关于Java多线程详解
本文深入讲解Java多线程编程,涵盖基础概念、线程创建与管理、同步机制、并发工具类、线程池、线程安全集合、实战案例及常见问题解决方案,助你掌握高性能并发编程技巧,应对多线程开发中的挑战。
|
1月前
|
数据采集 存储 前端开发
Java爬虫性能优化:多线程抓取JSP动态数据实践
Java爬虫性能优化:多线程抓取JSP动态数据实践
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
296 83
|
2月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
137 0
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
240 83
|
3月前
|
移动开发 Java
说一说 Java 是如何实现线程间通信
我是小假 期待与你的下一次相遇 ~