关于线程等待、线程唤醒方法的引入

public final void wait()
                throws InterruptedException  线程等待


public final void notify()    线程唤醒
  1 public class Student {
  2     private String name;
  3     private int age;
  4 
  5     public Student(String name, int age) {
  6         super();
  7         this.name = name;
  8         this.age = age;
  9     }
 10 
 11     public Student() {
 12 
 13     }
 14 
 15     public int getAge() {
 16         return age;
 17     }
 18 
 19     public void setAge(int age) {
 20         this.age = age;
 21     }
 22 
 23     public String getName() {
 24         return name;
 25     }
 26 
 27     public void setName(String name) {
 28         this.name = name;
 29     }
 30 
 31     @Override
 32     public String toString() {
 33         return "Student [name=" + name + ", age=" + age + "]";
 34     }
 35 
 36 }
 37 
 38 /**
 39  * 生产学生的类
 40  * 
 41  * @author Administrator
 42  *
 43  */
 44 public class SetStudent implements Runnable {
 45     private Student student;
 46 
 47 //    可以通过构造方法确定操作的是同一个学生
 48     public SetStudent(Student student) {
 49         this.student = student;
 50     }
 51 
 52 //    重写的run方法,让他调用生产学生的方法
 53     @Override
 54     public void run() {
 55         createStudent();
 56     }
 57 
 58 //  生产学生”张三“
 59     public void createStudent() {
 60         while (true) {
 61             student.setName("张三");
 62             student.setAge(11);
 63         }
 64     }
 65 
 66 }
 67 
 68 
 69 /**
 70  * 消费学生的类:输出学生
 71  * 
 72  * @author Administrator
 73  *
 74  */
 75 public class GetStudent implements Runnable {
 76     private Student student;
 77 
 78     @Override
 79     public void run() {
 80         getStudent();
 81 
 82     }
 83 
 84     public GetStudent(Student student) {
 85         this.student = student;
 86     }
 87 
 88 //   输出学生
 89     public void getStudent() {
 90         while (true) {
 91             System.out.println(student);
 92         }
 93 
 94     }
 95 }
 96 
 97 
 98 public class StudentTest {
 99     public static void main(String[] args) {
100 //        主方法创建一个学生,并通过参数传递赋给生产者和消费者,引用变量,传递同一个学生的引用地址,保证操作的都是一个对象
101         Student student = new Student();
102         SetStudent setStu = new SetStudent(student);
103         GetStudent getStu = new GetStudent(student);
104 //        创建线程
105         Thread setStudent = new Thread(setStu);
106         Thread getStudent = new Thread(getStu);
107 //        开启线程
108         setStudent.start();
109         getStudent.start();
110     }
111 }
112 //执行结果:
113 //Student [name=张三, age=11]
114 //Student [name=张三, age=11]
115 //Student [name=张三, age=11]
116 //Student [name=张三, age=11]
117 //Student [name=张三, age=11]
118 //Student [name=张三, age=11]
119 //Student [name=张三, age=11]
120 //Student [name=张三, age=11]
121 //Student [name=张三, age=11]
122 //Student [name=张三, age=11]
123 //Student [name=张三, age=11]
124 //Student [name=张三, age=11]
125 //Student [name=张三, age=11]
126 //Student [name=张三, age=11]
127 //Student [name=张三, age=11]
128 //Student [name=张三, age=11]
129 /**
130  * 这里可以看到生产者和消费者使用的对象都是同一个,但是,如果生产者生产的是两个人,张三和大黄蜂呢?
131  */

 

 1 /**
 2  * 生产学生的类
 3  * 
 4  * @author Administrator
 5  *
 6  */
 7 public class SetStudent implements Runnable {
 8     private Student student;
 9     private int index;
10 
11 //    可以通过构造方法确定操作的是同一个学生
12     public SetStudent(Student student) {
13         this.student = student;
14     }
15 
16 //    重写的run方法,让他调用生产学生的方法
17     @Override
18     public void run() {
19         createStudent();
20     }
21 
22 //  生产学生”张三“
23     public void createStudent() {
24         while (true) {
25             if (index % 2 == 0) {
26                 student.setName("张三");
27                 student.setAge(11);
28             } else {
29                 student.setName("大黄蜂");
30                 student.setAge(30);
31             }
32             index++; // 当为奇数时生产大黄蜂,当为偶数时生产张三
33         }
34     }
35 
36 }
37 
38 
39 public class StudentTest {
40     public static void main(String[] args) {
41 //        主方法创建一个学生,并通过参数传递赋给生产者和消费者,引用变量,传递同一个学生的引用地址,保证操作的都是一个对象
42         Student student = new Student();
43         SetStudent setStu = new SetStudent(student);
44         GetStudent getStu = new GetStudent(student);
45 //        创建线程
46         Thread setStudent = new Thread(setStu);
47         Thread getStudent = new Thread(getStu);
48 //        开启线程
49         setStudent.start();
50         getStudent.start();
51     }
52 }
53 //执行结果:
54 //Student [name=大黄蜂, age=11]
55 //Student [name=大黄蜂, age=30]
56 //Student [name=大黄蜂, age=11]
57 //Student [name=大黄蜂, age=11]
58 //Student [name=大黄蜂, age=11]
59 //Student [name=张三, age=11]
60 //Student [name=大黄蜂, age=11]
61 //Student [name=大黄蜂, age=11]
62 //Student [name=大黄蜂, age=30]
63 //Student [name=大黄蜂, age=30]
64 //Student [name=张三, age=30]
65 //Student [name=张三, age=11]
66 //Student [name=大黄蜂, age=11]
67 //Student [name=张三, age=11]
68 //Student [name=大黄蜂, age=30]
69 //Student [name=张三, age=11]
70 //Student [name=大黄蜂, age=11]
71 /**
72  * 这里虽然生产出来了不同的对象,但是年龄和名字好像不对号
73  * 解释:在同一个时间点,CPU只能执行一条指令,在生产者抢到CPU给名字赋值张三时,
74  * 消费者抢到了Cpu要输出,所以年龄并没赋值,用的是之前的年龄
75  * 解决办法:加一个同步代码块
76  */

在生产学生处和消费学生方法增加同步代码块

//  生产学生”张三“
    public void createStudent() {
        while (true) {
            synchronized (student) {
                if (index % 2 == 0) {
                    student.setName("张三");
                    student.setAge(11);
                } else {
                    student.setName("大黄蜂");
                    student.setAge(30);
                }
                index++; // 当为奇数时生产大黄蜂,当为偶数时生产张三
            }
        }
    }

//   输出学生
    public void getStudent() {
        while (true) {
            synchronized (student) {
                System.out.println(student);
                try {
                    Thread.sleep(100); // 输出太快了,模拟网络,让输出看起来均衡
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }

    }

public class StudentTest {
    public static void main(String[] args) {
//        主方法创建一个学生,并通过参数传递赋给生产者和消费者,引用变量,传递同一个学生的引用地址,保证操作的都是一个对象
        Student student = new Student();
        SetStudent setStu = new SetStudent(student);
        GetStudent getStu = new GetStudent(student);
//        创建线程
        Thread setStudent = new Thread(setStu);
        Thread getStudent = new Thread(getStu);
//        开启线程
        setStudent.start();
        getStudent.start();
    }
}
//执行结果:
//Student [name=null, age=0]
//Student [name=null, age=0]
//Student [name=null, age=0]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=张三, age=11]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
//Student [name=大黄蜂, age=30]
/**
 * 年龄对号,但是在生产者中添加了index,就是为了让奇数偶数一个一个分别输出,但是情况不对
 * 解释:虽然加了同步代码块,但是两个线程CPU的抢占时间是随机的,消费者一直抢占CPU就一直输出,但是生产者还没有生产出来,消费者不该输出
 * 解决办法:使用线程等待:
 *     生产者先生产,消费者再消费
    生产者没有生产,消费者等待
    生产者已经生产,消费者没有消费,生产者等待
 */

 完整

  1 public class Student {
  2     private String name;
  3     private int age;
  4     boolean flag = true; // 当为真时,生产者才生产
  5 
  6     public Student(String name, int age) {
  7         super();
  8         this.name = name;
  9         this.age = age;
 10     }
 11 
 12     public Student() {
 13 
 14     }
 15 
 16     public int getAge() {
 17         return age;
 18     }
 19 
 20     public void setAge(int age) {
 21         this.age = age;
 22     }
 23 
 24     public String getName() {
 25         return name;
 26     }
 27 
 28     public void setName(String name) {
 29         this.name = name;
 30     }
 31 
 32     @Override
 33     public String toString() {
 34         return "Student [name=" + name + ", age=" + age + "]";
 35     }
 36 
 37 }
 38 
 39 
 40 /**
 41  * 生产学生的类
 42  * 
 43  * @author Administrator
 44  *
 45  */
 46 public class SetStudent implements Runnable {
 47     private Student student;
 48     private int index;
 49 
 50 //    可以通过构造方法确定操作的是同一个学生
 51     public SetStudent(Student student) {
 52         this.student = student;
 53     }
 54 
 55 //    重写的run方法,让他调用生产学生的方法
 56     @Override
 57     public void run() {
 58         createStudent();
 59     }
 60 
 61 //  生产学生”张三“
 62     public void createStudent() {
 63         while (true) {
 64             synchronized (student) {
 65                 if (student.flag) { // 当flag为真时,已经生产,等待消费者消费,归还锁,当被唤醒就从这里开始
 66                     try {
 67                         student.wait();
 68                     } catch (InterruptedException e) {
 69                         e.printStackTrace();
 70                     }
 71                 }
 72                 if (index % 2 == 0) {
 73                     student.setName("张三");
 74                     student.setAge(11);
 75                 } else {
 76                     student.setName("大黄蜂");
 77                     student.setAge(30);
 78                 }
 79 
 80                 index++; // 当为奇数时生产大黄蜂,当为偶数时生产张三
 81                 student.flag = true; // 唤醒生产者,让他抢CPU
 82                 student.notify();
 83 //                
 84             }
 85         }
 86     }
 87 
 88 }
 89 
 90 
 91 /**
 92  * 消费学生的类:输出学生
 93  * 
 94  * @author Administrator
 95  *
 96  */
 97 public class GetStudent implements Runnable {
 98     private Student student;
 99 
100     @Override
101     public void run() {
102         getStudent();
103 
104     }
105 
106     public GetStudent(Student student) {
107         this.student = student;
108     }
109 
110 //   输出学生
111     public void getStudent() {
112         while (true) {
113             synchronized (student) {
114                 // 等于true时,生产者已经生产,此时消费者才可以消费,反之,当是false的时候,就应该等待生产者生产
115                 if (!student.flag) {
116                     try {
117                         student.wait();
118                     } catch (InterruptedException e) {
119                         e.printStackTrace();
120                     }
121                 }
122                 System.out.println(student);
123                 student.flag = false; // 改变参数,并且唤醒消费者线程,让他抢CPU
124                 student.notify();
125             }
126 
127         }
128 
129     }
130 }
131 
132 public class StudentTest {
133     public static void main(String[] args) {
134 //        主方法创建一个学生,并通过参数传递赋给生产者和消费者,引用变量,传递同一个学生的引用地址,保证操作的都是一个对象
135         Student student = new Student();
136         SetStudent setStu = new SetStudent(student);
137         GetStudent getStu = new GetStudent(student);
138 //        创建线程
139         Thread setStudent = new Thread(setStu);
140         Thread getStudent = new Thread(getStu);
141 //        开启线程
142         setStudent.start();
143         getStudent.start();
144     }
145 }
146 //执行结果:
147 //Student [name=张三, age=11]
148 //Student [name=大黄蜂, age=30]
149 //Student [name=张三, age=11]
150 //Student [name=大黄蜂, age=30]
151 //Student [name=张三, age=11]
152 //Student [name=大黄蜂, age=30]
153 //Student [name=张三, age=11]
154 //Student [name=大黄蜂, age=30]
155 //Student [name=张三, age=11]

 

 

转载于:https://www.cnblogs.com/19322li/p/10700939.html

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
应用背景为变电站电力巡检,基于YOLO v4算法模型对常见电力巡检目标进行检测,并充分利用Ascend310提供的DVPP等硬件支持能力来完成流媒体的传输、处理等任务,并对系统性能做出一定的优化。.zip深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值